私は現在、非常に大きなデータセットに対していくつかの情報検索および分類タスクを実行する必要がある Java のプロジェクトに取り組んでいます。小さなコレクションには 10,000 のドキュメントがあります。各ドキュメントから約 100 個の 150 次元の double のベクトル。つまり、150 個の double または 150M double の約 1M ベクトルです。保存した後、それらのすべてまたは一部を呼び出して、クラスタリング (KMEANS など) を実行する必要があります。実際のコレクションには、さらに多くのドキュメントがあります (現在、200K のドキュメントを扱っています)。
もちろん、私は OutOfMemoryError を数回処理しましたが、この問題に対する最後の解決策は、合計サイズが 5 GB を超える 10 個の巨大な XML ファイルに格納することでした。DOM Writer のメモリがいっぱいになったため、ファイル数は 10 でなければなりませんでした。読み取りには、メモリにロードせずにジョブを実行する SAX パーサーを使用しました。さらに、あらゆる種類のテキストに double を格納すると、実際のサイズが倍増し、解析と変換の計算コストが追加されます。最後に、クラスタリング アルゴリズムは通常反復的であるため、同じデータが何度も必要になります。私のメソッドは何もキャッシュせず、ディスクから何度も読み取るだけでした。
現在、任意の量のデータをバイナリ形式 (データベース、生のバイナリ ファイルなど) で格納するよりコンパクトな方法と、それらを効率的に読み取る方法を探しています。提案するアイデアはありますか?