0

大きなサンプル用と小さなサンプル用の 2 セットの HProf ダンプがあります。どちらも、私が持っている膨大なデータの非常に小さなサンプルの結果です。私は自分のアプローチのボトルネックを理解しようとしています。

これは、大規模サンプル ( http://pastebin.com/PEH8yR3v ) と小規模サンプル ( http://pastebin.com/aR8ywkDH )のヒープ割り当てデータです。

char[] が私のメモリの大部分を占めるものであることに気付きました。また、char[] によるメモリ使用量の割合は、小さなサンプル実行から大きなサンプル実行までさまざまです。サンプル全体をプロファイリングすると、どのように変化するかわかりません。

しかし、私が懸念している重要な質問は、10GB のデータを書き戻す 3GB のサイズの入力データに対して実行しようとしたときに、このプログラム (READ、PARSE/PROCESS、WRITE) を使用することです。サイズが 1GB を超えないリストを除いて、メモリには何も格納しません。これは単純な読み取り、処理、書き込みパイプラインです。これを考えると、私のプログラムは実行中にまだ約 7GB のメイン メモリを消費します。

これが私のアプローチです。

read a file in from a string Iterator
for each line in ip_file perform 
  op_buffer = myFunction(line)
write op_buffer to op_file.
Perform this for all 20K files in my input data. 

def myFunction(line)
{
 var :String = null;
 for each word in line  
  {
   var class_obj = new Classname(word)
   op_line + = class_obj.result
  }
return op_line
}

myFunction 内で作成されたオブジェクトは myFunction の最後で範囲外になるため、それらを削除/解放することは気にしません。ボトルネックを感じていますか?

4

1 に答える 1

2

myFunction 内で作成されたオブジェクトは、myFunction の最後で範囲外になるためです。

いいえ、そうしません。これは C++ ではありません。すべてのオブジェクトはヒープ上に作成され、ガベージ コレクションが可能になるまで存在し続けます。

また、疑似コードのどこにも宣言していないop_lineので、メソッド呼び出し間で保持されていると思います。それがメモリリークだと思います。つまり、1 億バイトを超える単一の文字配列を使用する方法はありません。これは、「小さな」ヒープ ダンプが示すものです。

于 2013-11-09T20:07:01.087 に答える