• ベストアンサー

最小ワーキングセットサイズ

GetProcessWorkingSetSizeの最小ワーキングセットサイズ、最大ワーキングセットサイズの意味が良く分かりません。 MSDN等で調べた結果、最小ワーキングセットサイズはそのプロセスがRAMにメモリーを確保しているサイズ、最大ワーキングセットサイズは仮想メモリーを使ってでも、そのプロセスで確保しているサイズの様な気がして来ましたが合っているでしょうか。 合っていれば、SetProcessWorkingSetSizeの最小ワーキングセットサイズはそのプロセスでRAMにメモリーを確保したいサイズ、最大ワーキングセットサイズは仮想メモリーを使ってでも、そのプロセスで確保したいサイズですよね。 お分かりに成る方、よろしくご回答下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

ワーキングセットは、物理メモリ使用量のことなので、仮想メモリ量とは全く関係ありません。 最小ワーキングセットサイズ ≦ ある瞬間の実際のワーキングセット ≦ 最大ワーキングセットサイズ そのプロセスにどれだけ物理メモリを使わせてもいいかを表します。 ・これ以下になると、まともに動かない→最小サイズに指定 ・これ以上使わせると、他のプロセスに迷惑→最大サイズに指定

TinyPine
質問者

お礼

ご回答ありがとう御座います。私の場合、今、カメラの画素サイズに合わせたメモリーを確保しようとしていますが、その場合、最小サイズは画素サイズとスタック等に使用するサイズであれば良いのでしょうか。 安直な考えですが、ActualProcessに対してGetProcessWorkingSetSizeで得た最小、最大サイズはスタック等を考慮していると思いますので、これに必要なサイズを各々加算してChangeWorkingSetし、その後VatualAlloc、VertualLockすれば当初の目的を安全に? 実行出来ると言う事に成るのでしょうか。

その他の回答 (1)

回答No.2

 こんにちは。しなくても出来る筈です。 DWORD min, max; ::GetProcessWorkingSetSize(::GetCurrentProcess(), &min, &max); const DWORD vaSize = max * 100; //::SetProcessWorkingSetSize(::GetCurrentProcess(), min, vaSize); VOID* p = ::VirtualAlloc(NULL, vaSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); ::VirtualLock(p, vaSize); for(int i = 0; i < vaSize; ++i) { LPBYTE pByte = (LPBYTE)p; pByte[i] = i; } ::VirtualUnlock(p, vaSize); ::VirtualFree(p, 0, MEM_RELEASE);  ただ、MSDNのSetProcessWorkingSetSize()APIの「解説」内で「慎重に使え」と書かれている通り、システム全体のパフォーマンスに関わって来る様な代物なので、おいそれと選択すべきではなさそうです。  カメラ画像のサイズがどれ程か分からないのですが、余りにもサイズが大きすぎて、パフォーマンスが不安であれば  メモリマップドファイル関連のAPI  http://msdn.microsoft.com/ja-jp/library/cc430093.aspx  を使用した方が簡単ではないでしょうか。  当方が知る限りでは、CD/DVD/BRのライティングソフトでは、巨大データをファイル化したものをメモリにマップしてから、焼き付けると言った方法を使用しているものがあります(ギガ単位なので普通に考えれば大抵そうなる)。

TinyPine
質問者

お礼

ご回答ありがとう御座います。 現在は200万バイトの領域1をchar[];で取っており、画素の少ないカメラの時も最大画素が取られてしまうのでvirtualAllocを使おうとしています。 今後、200万画素以上のカメラにも対応出来る様にする為にも。 ただ、MSDNの説明が良く分からず質問させて頂きました。パーフォーマンスに関しては、既に200万画素分固定で取っているので問題無いと思います。 少なくとも、Minに必要バイト数+ スタック等を確保すれば良い訳だと思います。Maxの指定があったので訳が分からなく成りました。

関連するQ&A