アプリケーションのメモリ使用量が約1.3GBを超えると、c#アプリケーションでメモリ不足例外が発生します。
3 GBのメモリを搭載した32ビットマシンでも同じ問題が発生し、当時は理にかなっていましたが、ハードウェアをハイエンドマザーボードとRAMを搭載した16 GBメモリの64ビットマシンにアップグレードしました_ただし、1.3GBを超えるとメモリ不足例外が発生します!
私は2GBを超える単一のオブジェクトはなく、1.3は2GBよりも小さいことを知っているので、単一のオブジェクトに組み込まれたMS 2GBの制限は問題ではない可能性があります...
アプリが特定のメモリ使用量のしきい値に達すると、何らかの種類のWindows Kill-Switchがあるように見えます...それをレジストリに設定する方法があるはずです。
どんな助けも大歓迎です!
同じターゲットアーキテクチャにcompileするまで違いはありません。 Ipose両方のケースで32
ビットアーキテクチャ用にコンパイルしていると仮定します。
OutOfMemoryException
は、 CLR (たとえば 2GB
)で単一のコレクションによって割り当てられたメモリのList<T>
を取得した場合にも発生する可能性があることに言及する価値があります両方のアーキテクチャ32
および64
ビット。
64
ビットアーキテクチャでメモリの利点を活用するには、64
ビットアーキテクチャをターゲットとするコードをcompileする必要があります。その後、当然、バイナリは64
ビットでonlyで実行されますが、RAMで使用可能なスペースが増える可能性があります。
既に述べたように、x64でアプリをコンパイルすると、使用可能なメモリがはるかに多くなります。
ただし、x86でアプリを構築する必要がある場合は、メモリ制限を1,2GBから4GBに上げる方法があります(32ビットプロセスの実際の制限)。
Visual StudioインストールディレクトリのVC/binフォルダーには、editbin.exe
ファイルが必要です。だから私のデフォルトのインストールでは、私はそれを見つけます
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe
プログラムを機能させるには、最初に同じディレクトリでvcvars32.bat
を実行する必要があります。それから
editbin /LARGEADDRESSAWARE <your compiled exe file>
プログラムで4GB RAMを使用するには十分です。 <your compiled exe file>
は、プロジェクトのコンパイル中にVSが生成したexeです。
プロジェクトをコンパイルするたびにこの動作を自動化する場合は、実行されたプロジェクトに対して次のビルド後イベントを使用します。
if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
call "$(DevEnvDir)..\tools\vsvars32.bat"
editbin /largeaddressaware "$(TargetPath)"
)
補足:Visual Studioで1.2GBの代わりに4GB RAMを使用するために、devenv.exe
でも同じことができます(ただし、最初に古いdevenv.exe
をバックアップします)。
64ビットArchを使用しているように見えますが、32ビットバージョンの.NETランタイムや32ビットバージョンのWindowsがあります。
そのため、プロセスで使用できるアドレス空間は同じままで、以前の設定から変更されていません。
64ビットOSと64ビット.NETバージョンの両方にアップグレードしてください;)
アプリケーションは64ビットまたは32ビットプロセスとして実行されていますか?これはタスクマネージャーで確認できます。
システム全体が64ビットで実行されていても、32ビットとして実行されている可能性があります。
32ビットの場合、サードパーティのライブラリがこれを引き起こしている可能性があります。ただし、コメントに記載されているように、まずアプリケーションが「任意のCPU」用にコンパイルされていることを確認してください。
この方法は、次の設定なしでは機能しません。
- プロンプトcmd.exeを実行します(重要:管理者として実行)
- bcdedit.exeと入力して実行します
- 「increaseuserva」パラメータを見て、次のステートメントを書くことはありません
- bcdedit/set incrementuserva 3072
- そして再びステップ2とparamsを確認してください
この設定を追加して、このブロックを開始しました。
if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
call "$(DevEnvDir)..\tools\vsvars32.bat"
editbin /largeaddressaware "$(TargetPath)"
)