1

画像処理を実行するマルチスレッド サービスを作成しました。クライアントの 1 人が大量のメモリを備えた 16 プロセス サーバーに製品をインストールするまで、すべてがうまく機能していました。現在、サービスは多くのメモリ不足エラーをスローしますが、インストールされているメモリの量に関係なく、プロセスは 1.5 GB のメモリしか取得できないため、これは理解できます。

この状況で受け入れられている解決策は何ですか? 代わりに、このサービスは別のワーカー プロセスを生成する必要がありますか? 名前付きパイプを介してメイン サービスと通信する CPU ごとに 1 つのワーカー プロセスを用意する必要がありますか?

編集 64ビットサーバーで実行していますが、イメージングライブラリの制限によりx64をターゲットにすることはできません

ありがとうございました

4

1 に答える 1

2

これには複数の解決策があります。オプションの一部を次に示します。

  1. .exe を/LARGEADDRESSAWARE オプションとリンクします。これにより、アプリに最大 3 ギガの RAM が提供され、その他の変更は必要ありません。
  2. 64 ビット バージョンの 32 ビット バイナリを提供したソフトウェア ベンダーに問い合わせてください。
  3. 32 ビットの依存関係をアウト プロセス (COM または WCF 経由の通信など) に移動し、EXE アーキテクチャを 64 ビットに変更します。
  4. スレッドではなく、実行アクションごとに新しいプロセスを生成します。
  5. Address Windowing Extensionsを使用するようにコードを変換します。

オプション #1 と #2 は実装が最も簡単で、#5 は最も難しいです。

編集C#あなたの質問にタグがあることに気づきました。マネージド アプリの場合は、 EditBin.exe ツールを使用して、Large Address Aware フラグを引き続き使用できます。

于 2012-06-08T14:51:35.267 に答える