5

Delphi を使用してロガー/スニファーを開発しています。操作中に大量のデータを取得し、ストレス操作中に約 3 GB のデータに蓄積する可能性があります。特定のコンピューターでは、これらのレベルに達すると、アプリケーションが機能を停止し、例外がスローされることがあります。

現在、GetMem 関数を使用して各メッセージにポインターを割り当てています。

失敗の可能性を最小限に抑えるために、メモリを割り当てるより良い方法はありますか? サイズを厳密に制限することはできないことに注意してください。

HeapAlloc、VirtualAlloc、またはマップされたファイルの使用についてどう思いますか? どちらが良いでしょうか?

ありがとうございました。

4

1 に答える 1

5

あなたの根本的な問題は、32 ビット プロセスのハード アドレス空間の制限が 4GB であることです。3GB で問題が発生しているため/LARGEADDRESSAWARE、64 ビット Windows または 32 ビット Windows で /3GB ブート スイッチを使用していると推測できます。

以下を含むがこれらに限定されないいくつかのオプションがあると思います。

  1. 少ないメモリを使用します。おそらく、小さなチャンクで処理するか、メモリの一部をディスクにプッシュできます。
  2. 64 ビットの Delphi (リリースされたばかり) または FreePascal を使用します。これにより、アドレス空間の制約から解放されますが、64 ビット バージョンの Windows に制限されます。
  3. メモリ マップ ファイルを使用します。多くのメモリを搭載したマシンでは、これは OS メモリ キャッシュにアクセスする方法です。メモリ マップ ファイルは気弱な人向けではありません。

私はあなたのアーキテクチャを知らないため、ソリューションについて明確にアドバイスすることはできませんが、私の経験では、メモリ フットプリントを削減することが最善のソリューションであることがよくあります。

別のアロケーターを使用しても、ほとんど違いはありません。はい、断片化の少ないアロケーターがあることは事実ですが、それらは確かにあなたの問題を本当に解決しません。彼らができることは、発生する可能性をわずかに低くすることだけです.

于 2011-09-12T18:40:40.840 に答える