3

ハードディスク上のファイルにデータを配置するwindowsでc++を使って仮想アロケータを作り、大きなオブジェクトを配置する際の物理メモリの使用量を減らしたい!.. virtualAllocでシステムの仮想メモリを使いたくない.. . ディスク上にファイルを作成し、それを使用してオブジェクト全体を割り当て、必要な部分またはオブジェクトを RAM に移動したいと考えています。

メモリ マップ ファイルを使用しようとしましたが、いくつかの問題に直面しました: マップ ファイルを使用してベクター要素を割り当てましたが、それらのいずれかを削除するためにベイクすると、要素のアドレスが変更され、メソッドが見つかりません。 「私のテストではファイル全体をマップしました」必要な場合にのみオブジェクトをマップします!

どんなリソースやオープンソース プロジェクトも役に立ちますか???

4

5 に答える 5

3

Googleはここでお手伝いできます。数年前に、共有メモリストアを使用するカスタムSTLアロケータを実装しました。同じ手法を使用して、ディスクでバックアップされたアロケータを実装できます。インスピレーションを得るために、このSourceForgeプロジェクトを確認することから始めます。

于 2009-07-14T12:41:14.927 に答える
2

Boost.Interprocess からインスピレーションを得られるかもしれません。Boost.Interprocess は、メモリ マップされたファイル、およびそのメモリ上のアロケーターとコンテナーのサポートを提供します。

アロケーターの設計に関する詳細は、http: //www.boost.org/doc/libs/1_37_0/doc/html/interprocess/architecture.html にもあります。

于 2009-07-14T13:16:19.360 に答える
1

申し訳ありませんが、(仮想) メモリのしくみを理解できていません。「『カスタムメモリアロケータ』を作りたいけど、メモリから大きなスペースを取らない」とおっしゃる一方で、「要素のアドレスが変わってしまった」と驚かれます。

これはかなり期待できます。(論理) オブジェクトのアドレスが変更されないようにするには、そのアドレスによって表されるメモリをオブジェクトにコミットしておく必要があります。メモリを解放すると、再利用できるようになり、アドレスも再利用できます。また、アドレスが再利用された場合、オブジェクトをそのアドレスにページ バックすることはできません。

最終的に、ここでの問題は、アドレスとメモリが非常に深く結びついていることです。メモリのリサイクルとは、アドレスのリサイクルを意味します。

于 2009-07-14T13:15:53.557 に答える
0

おそらくこれを解決する最善の方法は、大きなオブジェクトへの通常のポインターを返さないことです。小さなプロキシを返すだけです。これらのプロキシ オブジェクトは、より大きなオブジェクトの完全なインターフェイスを実装します。ただし、これらのプロキシ オブジェクトは、RAM またはディスク上の生データを処理できます。プロキシは、RAM の使用を最適化するために、それらの間で LRU メカニズムを実装します。呼び出し元は、これらのプロキシのアドレスが変更されることも、生データへのポインターを取得することもありません。

于 2009-07-14T13:59:33.160 に答える