0

何百万ものエントリを含む 12 GB のテキストという巨大なダンプ ファイルがあります。各エントリには、数値 ID、一部のテキスト、およびその他の無関係なプロパティがあります。このファイルを、効率的なルックアップを提供するものに変換したいと考えています。つまり、id を指定すると、テキストがすぐに返されます。制限:

  1. できれば外部サーバーや外国語に依存しない Java に埋め込まれています。
  2. インメモリではなく、ディスクの読み取りと書き込み - 12GB の RAM がありません。
  3. 爆発しすぎない - 12GB のファイルを 200GB のインデックスに変えたくありません。全文検索、並べ替え、または特別なものは必要ありません。キーと値のルックアップだけです。
  4. 効率的 - 大量のデータがあり、マシンが 1 台しかないため、速度が問題になります。大きなバッチを保存できるツールや、複数のスレッドで適切に機能するツールが推奨されます。
  5. 複数のフィールドを保存するのは良いことですが、必須ではありません。主な関心事はテキストです。

あなたの推薦は大歓迎です!

4

2 に答える 2

0

Java に付属しているデータベースであるJavaDbを使用してみませんか?

情報をディスクに保存し、適切にインデックスを作成していれば、検索に関して効率的です。JVM内で実行されるため、別のサーバー/サービスは必要ありません。標準の JDBC を使用して対話します。

かなり効率が良いと思います。このデータベースには長い歴史があり (以前は IBM の Derby でした)、堅牢性と効率性の点で多くの努力が費やされてきました。

データベースを作成するには、最初にデータのオンボーディングを行う必要があることは明らかですが、これは 1 回限りの作業です。

于 2012-12-06T11:21:25.717 に答える
0

Java Chronicleなどを使用します(部分的には私が作成したためです)。これは、大量のデータ (マシンよりも大きい) にランダムにアクセスするように設計されているためです。

テキスト形式またはバイナリ形式 (または必要に応じて組み合わせ) で任意の数のフィールドを格納できます。ランダムにアクセスできるようにするレコードごとに 8 バイトが追加されます。レコードの削除はサポートされていませんが (再利用のためにマークを付けることができます)、新しいレコードを更新および追加できます。

書き込みスレッドは 1 つしか持てませんが、同じマシン上の多数のスレッド (異なるプロセスであっても) で読み取ることができます。

バッチ処理はサポートしていませんが、典型的なサブ マイクロ秒のレイテンシで毎秒数百万のエントリを読み書きできます (メモリにないランダムな読み書きを除く)。

ほとんどヒープを使用しない (TB のデータに対して 1 MB 未満)

シーケンシャルなIDを使用しますが、その変換だけを行うテーブルを作成できます。

ところで: 200 ドル未満で 32 GB を購入できます。おそらく、より多くのメモリを取得する時が来ました;)

于 2012-12-06T11:23:42.583 に答える