6

オブジェクトの配列 (画像など) がありますが、大きすぎてメモリに収まりません (40GB など)。しかし、私のコードは実行時にこれらのオブジェクトにランダムにアクセスできる必要があります。

これを行う最善の方法は何ですか?

もちろん、私のコードの観点からは、一部のデータがディスク上にあるか、メモリに一時的に格納されているかは問題ではありません。透過的なアクセスが必要です。

container.getObject(1242)->process();
container.getObject(479431)->process();

しかし、このコンテナをどのように実装すればよいでしょうか? リクエストをデータベースに送信するだけですか?もしそうなら、どれが最良の選択肢でしょうか?(データベースの場合は、無料で、管理の手間があまりかからないようにする必要があります。おそらく、Berkeley DB か sqlite でしょうか?)

自分で実装して、アクセス後にオブジェクトをメモ化し、メモリがいっぱいになったときにメモリをパージする必要がありますか? または、これに適したライブラリ (C++) はありますか?

コンテナーの要件は、ディスク アクセスを最小限に抑え (一部の要素はコードによってより頻繁にアクセスされる可能性があるため、メモリ内に保持する必要があります)、高速アクセスを可能にすることです。

更新:コンテナーに格納するオブジェクトのサイズが動的であるため、STXXL は問題に対して機能しないことが判明しました。しかし、STXXL はそれを処理できません。

STXXL コンテナーは、格納するデータ型がプレーン オールド データ型 (POD) であることを前提としています。 http://algo2.iti.kit.edu/dementiev/stxxl/report/node8.html

他のソリューションについてコメントしていただけますか?データベースの使用についてはどうですか?そしてどれ?

4

5 に答える 5

8

STXXLの使用を検討してください。

STXXL のコアは、外部メモリ (アウトオブコア) 計算用の C++ 標準テンプレート ライブラリ STL の実装です。つまり、STXXL は、ディスクにのみ収まる膨大な量のデータを処理できるコンテナーとアルゴリズムを実装します。STL との互換性により、使いやすさと既存のアプリケーションとの互換性がサポートされますが、もう 1 つの設計上の優先事項は高性能です。

于 2010-01-25T19:34:48.733 に答える
1

基本的なキャッシュを実装します。このワーキングセットのサイズでは、x バイトのキャッシュ行 (x == アクセス パターンに最適なもの) を持つセット アソシエイティブ キャッシュで最良の結果が得られます。最新のすべてのプロセッサがすでにハードウェアに搭載しているものをソフトウェアに実装するだけです。これにより、最高の結果が得られるはずです。アクセスパターンを何らかの形で線形に最適化できる場合は、さらに最適化できます。

于 2010-01-25T19:38:06.500 に答える
1

メモリ マップされたファイルを調べて、それらのいずれかにアクセスすることもできます。

于 2010-01-25T19:34:11.000 に答える
0

operator[]()オーバーロードしてオンザフライでディスク アクセスを実行し、必要なデータをディスク/データベースから透過的にロードする非常に巧妙なコードを見てきました。

于 2010-01-26T14:01:54.983 に答える
0

1 つの解決策は、B ツリーに似た構造、インデックス、および配列またはベクトルの「ページ」を使用することです。概念は、変数にアクセスするためにメモリにロードするページを決定するためにインデックスが使用されるということです。

ページ サイズを小さくすると、複数のページをメモリに格納できます。使用頻度やその他のルールに基づいたキャッシュ システムにより、ページの読み込み回数が削減されます。

于 2010-01-25T22:07:45.957 に答える