2012-10-03 15 views
6

現在、私は非常に大きなデータセットに対して複数の情報検索と分類タスクを実行する必要があるJavaプロジェクトを作成しています。小さなコレクションには10Kのドキュメントがあります。各文書から、約150次元の2倍のベクトル。したがって、150メガバイトの150メガバイトまたは150メガバイトのベクトル。格納した後、それらのすべてをリコールするか、またはそれらのパーセンテージをリコールし、クラスタリング(例:KMEANS)を実行する必要があります。実際のコレクションにはさらに多くの文書があります(私は現在、200,000の文書を扱っています)。Javaで大きなデータセットを保存して検索する最良の方法

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

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

答えて

4

埋め込みデータベースまたはキー値ストレージ。それらの多くがあります。 JDBM3。 xml形式で保存するのはどういう奇妙なアイデアですか?標準的なシリアライズ手法を使用してファイルに配列をダンプするだけで済みます。

+1

JDBM3は、より良い[て、mapdb](http://www.mapdb.org/)として知っている、JDBM4にアップグレードされました。 –

0

この目的でDerbyを使用しないでください。以上500Kエントリの記憶が、私はあなたのケースについてとてもよくわかりませんが、私たちの「大規模データの処理」のために、我々はNoSQLのDBを使用し、それは非常にうまく働い必要が非常に遅く、

1

あまりにも多くのメモリを使用しています。

+0

一般的なビッグデータアプローチでこの回答を拡張します。非常に大きなファイルを処理するためのhadoopと、そのデータを保持するNoSQLデータベース(@ jakub.petr) –

0

メモリ内のデータグリッドによって問題が解決する場合があります。オープンソースのソリューションがいくつかあります(Hazelcast、Infinispan)。

私はまだhazelcastで働いている - ので、あなたが他の人については何も言うことができません。

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

関連する問題