さて、私はこれまでメインメモリで多くの異なるオブジェクトを持ち、各オブジェクトがシステム内の他のオブジェクトのリストを格納するシステムを開発してきました。これを永続ストレージに移動したいと思います。システム用のカスタムデータベースを作成していることがポイントであるため、DBMSを使用するという明白な答えを探していません。
次に、オブジェクトごとにIDを割り当てます。IDをテーブルで検索して、そのオブジェクトのデータの場所のブロックとオフセットを見つけることができます。これで、各オブジェクトには、システム内の他のオブジェクトを指すリスト/セットがあります。したがって、明らかにストレージには、他のオブジェクトを見つけるために使用できる8バイト(IDにlongを使用)IDのリストがあります。ここでの私の質問は、リストが時間の経過とともに成長することを知っているので、リストを成長させる余地が必要であるということです。リストを保存して、オブジェクトが大きくなったときにオブジェクトを移動する必要がないようにするためのこれまでの私の最善の考えは、各リストにオブジェクトと同じようにIDを割り当てて、オブジェクトと同じようにテーブルで検索できるようにすることです。それらはディスク上にあります。
これで、各リスト部分に10個のオブジェクトを格納するためのスペースが割り当てられ、さらにオブジェクトが含まれている場合は、最後に次のリスト部分のIDになります。これは、それを実行し、絶えず成長するオブジェクトを処理するための適切な方法のように思えますが、より良いアプローチがあるかどうか疑問に思っています。インデックスをメモリに保存する(スペースが許す限り)ので、オブジェクトIDが与えられると、ルックアップはメモリ内にあり、ディスクからデータとリストIDを取得するのに1 I/Oかかります。次に、トラバースするリストごとに、ブロックがキャッシュされている場合、リスト内の10個以下のオブジェクトごとに別のルックアップとI/Oが必要になります。
I / Oの数はひどくなく、リスト部分の局所性を維持して不要なI / Oを排除しようとしますが、これを行うためのより良い方法はありますか?リストをオブジェクトとは別に保存しようとするのは正しいですか、それともオブジェクトのデータと一緒にリストを保存する方法を検討する必要がありますか。それを行うことについての私の心配は、あるリストが大きくなるにつれて、それは別のリストにぶつかり、次に断片化する必要があり、これはより複雑になる可能性があるということです。どんな提案でもありがたいです、そして前もって感謝します。