1

次の形式の大きなデータセットがあります。

合計で、3687個のオブジェクトファイルがあります。それぞれに2,000,000レコードが含まれています。各ファイルのサイズは42MBです。

各レコードには次のものが含まれます。

  • id(整数値)
  • 値1(整数)
  • Value2(整数)
  • Value3(整数)

各ファイルのコンテンツは、データ収集プロセス中に観察されるため、並べ替えや順序付けは行われません。

理想的には、このデータのインデックスを作成したいと思います。(idでインデックス付けされます)これは次のことを意味します:

  1. IDのセットを管理可能なチャンクに分割します。

  2. ファイルをスキャンして、現在のワーキングセットのIDに関連するデータを取得します。

  3. インデックスを作成します。

  4. 次のチャンクに移動して、1、2、3を繰り返します。

私にはこれは問題ないように聞こえますが、152GBを前後にロードするのは時間がかかり、可能な限り最良のアプローチについて、あるいはJavaが実際にそのようなプロセスに使用するのに適切な言語であるかどうかさえ疑問に思います。

私のマシンには256GBのRAMと32コアがあります。


更新: これを変更して、I / Oを脇に置き、ファイルがバイト配列のメモリ内にあると仮定します。

2,000,000レコードを持ち、各レコードに4つの整数がシリアル化されている42MBのオブジェクトファイルをデコードするための最速の方法は何でしょうか。

4

4 に答える 4

2

あなたはファイル形式の非常に貧弱な選択をしました。ロットをシリアル化された整数からDataOutputStream.writeInt()で記述されたバイナリintに変換し、DataInputStream.readInt()で読み取ります。どちらの場合も、下にバッファリングされたストリームがあります。大量のディスクスペースを節約できるため、I / O時間も節約でき、シリアル化のオーバーヘッド時間もすべて節約できます。そして、将来このフォーマットを使用するようにコレクションソフトウェアを変更してください。変換にはしばらく時間がかかりますが、一度だけ行われます。

または、シリアル化されたオブジェクトではなくネイティブintを使用して、提案されているようにデータベースを使用します。

于 2013-01-29T01:09:20.757 に答える
1

うーん..それを行うためのより良い方法は、ある種のDBMSを使用することだと思われます。すべてのデータをデータベースにロードすると、そのインデックス作成、ストレージ、およびクエリ機能を活用できます。もちろん、これは要件によって異なります。また、DBMSソリューションがこれに適しているかどうかによって異なります。

于 2013-01-29T00:46:11.797 に答える
1

したがって、私が行うことは、各ファイルをロードし、IDをある種のソートされた構造に格納することです-std :: mapおそらく[またはJavaの同等物ですが、ファイル名で読み取るのはおそらく約10〜20行のコードです次に、ファイルの内容をマップに読み込み、ファイルを閉じて次のファイルを要求します。おそらく、C++を記述してそれを実行します]。

実際にdbmsにロードしたい場合を除いて、他に何ができるか、またはすべきかはわかりません。これは、提案としてはまったく不合理ではないと思います。

于 2013-01-29T01:05:59.227 に答える
0

使用可能なメモリがデータセットよりも多く、非常に高いパフォーマンスが必要な場合、Redisを検討しましたか?単純なデータ構造での操作に最適であり、パフォーマンスは非常に高速です。

値を格納するときは、Javaにデフォルトのシリアル化を行わせることに少し注意してください。以前、シリアル化の前にプリミティブがオートボックス化されるという問題が発生しました。

于 2013-01-29T00:59:30.130 に答える