私は32GBのRAMと4つのSSDのセットを備えたLinuxボックスをRAID0構成で使用しており、最大スループットは約1GB(ランダムな4k読み取り)であり、それらのファイルにランダムかつ同時にアクセスするための最良の方法を決定しようとしています。 javaを使用します。これまでに見た2つの主な方法は、ランダムアクセスファイルとマップされた直接バイトバッファを使用することです。
ただし、ここで注意が必要です。私はオブジェクト用の独自のメモリキャッシュを持っているので、ファイルに保存されているオブジェクトへの呼び出しは、ページングされたメモリではなくディスクを経由する必要があります(これを防ぐためにLinuxボックスのスワップスペースを無効にしました)。マップされたダイレクトメモリバッファはおそらくスワッピングに依存する最速ですが、これは適切ではありません。A)オブジェクトキャッシュにすべての空きメモリを使用していますが、代わりにマップされたバイトバッファを使用すると、オブジェクトキャッシュの目的である大量のシリアル化オーバーヘッドが発生します。 (私のプログラムはすでにCPUに制限されています)B)マップされたバイトバッファを使用すると、OSはデータがディスクに書き込まれるタイミングの詳細を処理します。つまり、これを自分で制御する必要があります。write(byte [])を実行すると、すぐにディスクに送信されます。これは、ACIDトランザクションを使用していないため、電源障害が発生した場合のデータ破損を防ぐためです。
一方、私は大規模な並行性が必要です。同じファイル内の複数の場所に同時に読み取りと書き込みを行う必要があります(データの破損を防ぐためにオフセット/範囲ロックを使用している間)mappedbytebuffersなしでこれを行う方法がわかりませんが、常に読み取りをキューに入れることができます/書き込みますが、これがスループットにどのように悪影響するかはわかりません。
最後に、読み取りまたは書き込み用に新しいbyte []オブジェクトを作成しているときに状況が発生することはありません。これは、1秒あたりほぼ100000の読み取り/書き込み操作を実行するためです。これらのオブジェクトをすべて割り当ててガベージコレクションすると、プログラムが強制終了します。機密性が高く、すでにCPUが制限されているため、byte[]オブジェクトを再利用しても問題ありません。
私がそれらのほとんどを試したので、DBソフトウェアを提案しないでください、そしてそれらは多くの複雑さとCPUオーバーヘッドを追加します。
誰かがこの種のジレンマを持っていましたか?