1

私が書いているアプリでは、多くのメモリ内コンテナーを使用しています (C++ std コンテナーですが、それは関係ないと思います)。

私のアプリの1つの「タスク」中に、使用率の高いエッジケースでは、プライベートバイトのメモリ使用量が1GBに達します。

ちょっとしたコンテキストとして、このタスクはユーザーが開始した 100,000 個のファイルを含むタスクです。ユーザーがこれを開始してから、マシンを実行したままにする可能性があります。

(そして、ファイルをメモリにロードするようなばかげたことはしません。このフットプリントは、進行中のタスクに関連するすべてのメタデータです)。

ほとんどのユーザーにとって、このタスク中のメモリ使用量はごくわずかです。5,000 の「こと」ではなく、500,000 の「こと」を実行したいユーザーはわずか 1% です。

スクラッチ ファイルや組み込み DB など、このメモリ内の多くのものを何らかの方法でディスクに移動するプロセスに着手しようとしていました。

しかし、「ちょっと待ってください。これらのソリューションはすべて、基本的にメモリをディスクにキャッシュしています。それが仮想メモリの目的ではないでしょうか?」と考えました。

このデータを永続化することには興味がありません。タスクの実行中にアクセスする必要があるのは、純粋にスクラッチ/一時的なものです。

私の質問は、どうすればいいですか?

その 1% の大幅なリファクタリングはしたくありませんが、メモリ フットプリントが大きいアプリを実行した場合の影響を知りたいのです。

とにかく、Windows VM マネージャーよりもはるかに優れた機能はおそらくないだろうと言っているのは正しいでしょうか?

これはどのような条件下で有害になりますか? はい、そうです。実際のメモリをすべて使い果たした場合、ページをリロードするためにスラッシングが発生します。しかし、たとえば組み込みデータベースの場合は、とにかくそれを持っていませんか?

乾杯、

ジョン

4

1 に答える 1

2

はい、メモリマネージャがあなたに代わって仕事をします。ただし、副作用がないわけではありませんが、他のプロセスがマップしたページをRAMから削除して、それらを提供します。これらの他のプロセスはこれによって遅くなり、そのようなスワップアウトされたページにアクセスするとページフォールトが発生します。

ここでのバランスをとる行為は、アプリが他のプロセスが短期間で終了するのを正当化するのに十分「重要」であるかどうかです。通常、これはワークステーションでは「はい」、サーバーでは「いいえ」と鳴り響きます。

于 2010-03-18T17:24:15.183 に答える