0

毎秒 60K レコードの速度で巨大なデータをファイル/データベースに保存する必要があるカスタム ソリューションに取り組んでいます。このデータは、着信連続ストリームの結果です。

  1. leveldb - 複数の Java プロセスから同時にアクセスすることはできません

  2. berkleydb/kyoto Cabinet : 禁止されている商用ライセンス

  3. sqlite : sqlite4java を試してみましたが、一括操作をサポートしておらず、必要な速度で実行されていません。また、jdbc ラッパー (http://www.zentus.com/sqlitejdbc/) も試しましたが、これも必要な速度で実行されません。

データを db/file にダンプし、複数のプロセス (+スレッド) からアクセスできるようにするソリューションを提案してもらえますか?

4

5 に答える 5

1

データを db/file にダンプし、複数のプロセス (+スレッド) からアクセスできるようにするソリューションを提案してもらえますか?

複数のプロセス、複数のスレッド、および/またはその両方からのアクセスが必要な場合、1 秒あたり 60,000 レコードという目標を達成することは非常に困難です。これは、複数のスレッド/プロセスを使用している場合、ディスク I/O があまり効率的ではないためです。どのソリューションも、同じ基本モデルに縮小する必要があります。つまり、LevelDB に書き込むことができるスレッドは 1 つだけです。

LevelDB へのクロスプロセス アクセスが必要な場合は、ソケットまたはパイプを使用して、プロセス間に非常に単純な通信レイヤーを作成できます。すべてのクライアント プロセスからの複数のソケットまたはパイプ接続を受け入れる単一のプロセスを専用にし、ストリーミング データを受け入れます。次に、そのプロセスからデータを LevelDB に書き込みます。これをデータ プロセスと呼びましょう。

データ プロセスにはデータを提供する複数のスレッドがありますが、LevelDB にデータを読み書きする読み取り/書き込みスレッドは 1 つだけです。そのため、クライアント スレッドがレコードをエンキューするBlockingQueueとデータ スレッドを使用することもお勧めします。からレコードを読み取ります (データがない場合はブロックします)。

于 2012-03-26T13:30:20.640 に答える
0

MySQL InnoDB を試すことができます。十分に高速かどうかはわかりませんが、複数のプロセスが異なるデータのタプルにアクセスできます (ロックは行ごとに行われます)。

于 2012-03-26T08:08:27.670 に答える
0

sqlite-jdbc ライブラリを試すhttp://code.google.com/p/sqlite-jdbc/ これは、ネイティブ dll/so 実装の JDBC ラッパーです。

于 2012-03-30T14:08:11.443 に答える