Windows 8.1では、RAMを使い果たしたときにプロセスが最初に強制終了されないようにする方法はありますか?


18

Kinect v2からの色、赤外線、深度データをバッファリングする.NET 4.5アプリケーションを作成し、処理を実行してから、非圧縮形式でディスクにダンプします。.NETアプリケーションもffmpegをサブプロセスとして起動し、カラーデータをH.264としてエンコードされるようにパイプ処理します。

私はSSDを使用していないため、ビデオデータはディスクに書き込むよりも早く到着します。しかし、それは大丈夫です。RAMが不足しているときにビデオフレームを破棄してもかまいません。私の唯一の要件は、私が保持するものがほとんど8〜10秒のビデオの塊であることです。そのため、連続した8〜10秒のビデオ(約1.5〜2 GB)をバッファリングするのに十分なRAMがないときに、ビデオフレームの破棄を開始するロジックを.NET 4.5アプリケーションに追加しました。

また、ページのスラッシングを防ぐために、ページングファイルを完全に無効にしました。これにより、合計16 GBの物理RAMが残ります。

私の問題は、そのメカニズムが適切に設定されていても、Windows 8.1が低RAMをフリークすると、時々.NETアプリケーションまたはffmpegサブプロセスが強制終了することです。ディスクに書き込む。自分のプロセスが他のプロセスよりも重要であることをWindowsに伝える方法はありますか?


10
Windowsがプロセスを殺すとは思わなかった。それはLinux専用の機能だと思った。
スコットチェンバレン14

4
@ScottChamberlain:Windowsでページングファイルをオフにするのは非常にまれだからです。これにより、あらゆる種類の予期しない異常な動作が発生します。ここで明白な答えは、「ページングファイルをオフにしないでください。あなたのアプリがそのRAMを使用することはできませんので、力WindowsがRAM内の未使用データを維持すること」である
MSalters

1
これがStackOverflowの質問である場合CreateMemoryResourceNotificationは、はるかにハックの少ない方法を指摘できます。
MSalters 14

7
@Kal:ディスクアクセスがボトルネックの場合、より強力な圧縮を使用し、CPUがボトルネックの場合、より高速な圧縮を使用します。両方がボトルネックになっている場合は、設計全体を再考してやり直すか、より良いハードウェアを入手してください。
Mooingダック14

1
@FactorMystic OMG彼は何をしましたか?ページファイルを無効にすると、使用可能なRAMが大幅に削減されます。
アロン14

回答:


45

すべてのRAMが使用されている場合、Windowsはプロセスを強制終了しません。実際に起こるのは、プロセスがメモリの割り当てに失敗してクラッシュすることです。

これは、すべての物理メモリが使用中であり、ページファイルが無効になっているため、メモリマネージャが使用されていないページを書き込むことができなくなったために発生しています。これにより、物理RAMがいっぱいになり、プロセスまたはその時点で実行中の何かがページを割り当てようとすると失敗します。一部のアプリケーションがクラッシュします。

Technetのこのプレゼンテーションでは、http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405について説明しています。

ページファイルは、オーバーコミットメントのバックストップとして機能することにより、すべてのメモリを使用するときにアプリケーションがクラッシュするのを防ぎます。

仮想メモリは、最新のオペレーティングシステムがリソースを割り当てる方法のほとんどの基盤であるため、使用中のRAMにあるものを保持し、ディスクにデータを出し入れすることがすべてです。

実際には2つの答えしかありません。

  1. ページファイルを再度有効にし、コンピューターのRAMを増やしてディスクのスラッシングを減らします。
  2. アプリケーションのメモリ要件を減らします。

一番下の行は、RAMは単なる別のレベルのキャッシュであり、仮想メモリ、ページファイル、メモリマップドファイル、および基本的にこれに至るすべてのものに関するものです。メモリが不足している場合は、追加する必要がありますもっと。


4
以下の使用....
nhgrif

1
データを十分な速度でディスクに書き込むことができないため、バックログが蓄積されていることに注意してください。私は非常に同じディスク上の仮想メモリを有効にすると...そこに助けることができるとは思わない
アレクサンダー

3
実際、ページファイルはディスク上のどこかにあります。また、SSDではないことがわかっているため、これは最も遅いディスク操作である物理シークを意味します。
MSalters 14

9
アプリケーションで明示的なメモリ管理が必要なよう
Joe

1
@Joeまさにこれ。ガベージコレクターは、このような状況ではメモリ管理を悪夢のようにします。このような状況は、すべてのメモリ使用量を微調整できるため、C ++で対処するのは簡単です。この場合、C#でもうまく機能するデザインパターンがありますが、ほとんどの人が試そうとするほど単純ではありません。
Thebluefish 14

0

Windowsのツールパネルと詳細設定を使用して、不要なもの(ウィンドウエフェクトなど)をまだ無効にしていない場合は、Sysinternals Process ExplorerやSystem Monitorを使用して、CPUやメモリを浪費している余分なものを見つけて無効にします。

さらに重要なことは、Process Explorerおよび/またはSystem Monitorを使用して、プログラムの実行を監視し、正確にどこでどのように失敗するかを確認することです。どのスレッドがメモリ不足で最初に死にますか-メインprgmまたはffmpegパーツ?予期せずサイズが大きくなる特定のdllまたは他の共有リソースはありますか?それとも、データを噛むことができる以上に噛み付いていることを除いて、実行は正しく進行していますか?

問題の性質をより正確に把握することで、解決策の方向性がわかります。たとえば、フレームドロップポリシーをより積極的に実装し、8〜10秒のチャンク条件に最適化して全体的なRAMオーバーヘッドを低くすることができます。

最終的な提案:Linuxへの切り替えを検討し、その間にページングファイルを再度有効にすることをお勧めします(Linuxはそれをスワップスペースと呼びます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.