私は、ベクトルでエンコードされた単語を使用しているプロジェクトに取り組んでおり、これは約 2000 フロートの長さです。これらを未加工のテキストで使用する場合、各単語に出くわしたときにベクトルを取得し、それを使用していくつかの計算を行う必要があります。言うまでもなく、大きなボキャブラリ (~100k ワード) の場合、これには大きなストレージ要件 (テキスト ファイルで約 8 GB) があります。
私は当初、大きなテキスト ファイルを小さなファイルに分割し、特定の単語についてそのファイルを読み取り、そのベクトルを取得するシステムを持っていました。ご想像のとおり、これは遅すぎました。
次に、すべてをRAMに読み込もうとしました(約40GBのRAMが必要です)。すべてが読み込まれると、非常に高速になると考えました。ただし、読み込みには長い時間がかかり、これを行うには十分な空き RAM がある特定のマシンのみを使用する必要があるという欠点があります。ただし、データが読み込まれると、他のアプローチよりもはるかに高速になります。
データベースがこれらのアプローチとどのように比較されるのか疑問に思っていました. 取得は RAM アプローチよりも遅くなりますが、オーバーヘッド要件はありません。また、他のアイデアは大歓迎です。私自身も他のアイデアを持っています(つまり、キャッシュ、RAMにすべてがロードされたサーバーの使用など)。データベースのベンチマークを行うかもしれませんが、ここに投稿して、他の人が何を言わなければならないかを確認したいと思いました.
ありがとう!
アップデート
タイラーの提案を使用しました。私の場合、BTree が必要だとは思いませんでした。単語とそのオフセットをハッシュしただけです。次に、単語を検索して、実行時にそのベクトルを読み取ることができました。テキストに出現する単語をキャッシュしたので、各ベクトルはせいぜい 1 回だけ読み込まれますが、これにより、不要な単語を読み込んで保存するオーバーヘッドが節約され、RAM アプローチよりも優れています。
参考までに、私は Java の RamdomAccessFile クラスを使用し、readLine()、getFilePointer()、および seek() 関数を使用しました。
このスレッドに貢献してくれたすべての人に感謝します。
更新 2
パフォーマンスをさらに改善するには、http://minddumped.blogspot.com/2009/01/buffered-javaiorandomaccessfile.html からバッファリングされた RandomAccessFile をチェックして ください。
どうやら RandomAccessFile からの readLine はバイト単位で読み取るため非常に遅いようです。これにより、いくつかの素晴らしい改善が得られました。