6

私は現在、非常に大きなデータセットに対していくつかの情報検索および分類タスクを実行する必要がある Java のプロジェクトに取り組んでいます。小さなコレクションには 10,000 のドキュメントがあります。各ドキュメントから約 100 個の 150 次元の double のベクトル。つまり、150 個の double または 150M double の約 1M ベクトルです。保存した後、それらのすべてまたは一部を呼び出して、クラスタリング (KMEANS など) を実行する必要があります。実際のコレクションには、さらに多くのドキュメントがあります (現在、200K のドキュメントを扱っています)。

もちろん、私は OutOfMemoryError を数回処理しましたが、この問題に対する最後の解決策は、合計サイズが 5 GB を超える 10 個の巨大な XML ファイルに格納することでした。DOM Writer のメモリがいっぱいになったため、ファイル数は 10 でなければなりませんでした。読み取りには、メモリにロードせずにジョブを実行する SAX パーサーを使用しました。さらに、あらゆる種類のテキストに double を格納すると、実際のサイズが倍増し、解析と変換の計算コストが追加されます。最後に、クラスタリング アルゴリズムは通常反復的であるため、同じデータが何度も必要になります。私のメソッドは何もキャッシュせず、ディスクから何度も読み取るだけでした。

現在、任意の量のデータをバイナリ形式 (データベース、生のバイナリ ファイルなど) で格納するよりコンパクトな方法と、それらを効率的に読み取る方法を探しています。提案するアイデアはありますか?

4

4 に答える 4

4

組み込みデータベースまたはKey-Valueストレージ。それらはたくさんあります、例えばJDBM3。そして、xml形式で保存するという奇妙なアイデアは何ですか?標準のシリアル化手法を使用して、ファイルに配列を単純にダンプできます。

于 2012-10-03T17:34:24.127 に答える
1

あなたのケースについてはよくわかりませんが、「大規模なデータ処理」のニーズのために、noSQL DB を使用しましたが、非常にうまく機能しました。

于 2012-10-03T17:42:33.800 に答える
0

この目的でダービーを使用しないでください。500kを超えるエントリの保存は非常に遅く、メモリを大量に使用します

于 2012-10-03T17:38:46.357 に答える
0

インメモリ データグリッドが問題を解決する場合があります。利用可能なオープン ソース ソリューションがいくつかあります (Hazelcast、Infinispan)。

私はまだ hazelcast しか使ったことがないので、他のものについては何も言えません。

Hazelcast は、データを複数のノードに分散します。クエリは、クラスター内のすべてのノードにも分散されます。

于 2012-10-03T20:38:01.437 に答える