2011-09-12 2 views
5

私はDelphiを使ってロガー/スニファを開発しています。操作中にデータが大量に失われ、ストレス操作中に約3GBのデータに蓄積される可能性があります。 これらのレベルに到達した特定のコンピュータでは、アプリケーションが機能しなくなり、例外がスローされることがあります。高容量ロガーアプリケーションにはどのような割り当て方法を使用しますか?

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

私は失敗の可能性を最小限に抑えるためにメモリを割り当てるより良い方法はありますか?私はハード限界にサイズを制限することはできませんことを覚えておいてください。

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

ありがとうございます。

+1

[Flume](https://cwiki.apache.org/FLUME/)のような既存の大容量ロガーを使用できますか? – Barend

+1

メモリの割り当てを減らすか、または64ビットのデルファイに切り替える –

+0

@Barend私たちのプロセス+ USBデータ(私の会社は携帯電話で動作し、通信中にはすべてのUSBパケットがロガーに追加されます)から情報を取得するリアルタイムの社内ロガーです。 。私は準備が整ったロガーがそれを正しく処理できるとは思わない。 – Ran

答えて

5

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

私はあなたが以下を含むがこれらに限定されないいくつかのオプションを持っていると思う:

  1. 少ないメモリを使用してください。おそらく、小さなチャンクで処理したり、メモリの一部をディスクにプッシュしたりすることができます。
  2. 64ビットDelphi(リリース済み)またはFreePascalを使用します。これにより、アドレス空間の制約が緩和されますが、Windowsの64ビットバージョンに制限されます。
  3. メモリマップファイルを使用します。多くのメモリを持つマシンでは、これはOSメモリキャッシュへのアクセス方法です。メモリマップされたファイルは、かすかな心のためではありません。

あなたのアーキテクチャはわかりませんが、私の経験では、メモリフットプリントを減らすことがしばしば最適な解決策です。

異なるアロケータを使用すると、ほとんど違いはありません。はい、断片化の少ないアロケータがあることは間違いありませんが、本当にあなたの問題を解決することはできません。彼らができることは、発生する可能性はやや低くなります。

+3

メモリマップされたファイルは前進するための1つの方法かもしれませんが、可能な限り最大の割り当てを終了する可能性があります。 > 3Gbの複雑なマッピングがあるでしょう。メモリ要件を減らすために、ログメッセージをトークン化するのが最善の選択肢であると私は思います。したがって、「エラー」と「開始」と「開始」が1バイトに減少する可能性があります。一般的なことを解決するために静的分析が必要ですが、要件をすばやく半分にすることができます。 – mj2008

関連する問題