1

大きなテキストファイルの読み取り中にメモリ使用量を削減するための Java のメカニズムはありますか?

私が遭遇したほとんどすべてのプログラムは、文字列を使用してテキスト ファイルを読み取ります。しかし、Java は文字列リテラルごとにスペースを予約します。そのため、すべての文字列オブジェクトが格納されるため、メモリ使用量が増加すると思います。java.io のすべてのクラスは String を扱います。しかし、StringBuilder を使用していない場合、メモリ使用量を削減するにはどうすればよいでしょうか?

結局のところ、メモリ使用量の削減は StringBuilder の主な関心事です [String のように不変ではないため]。次に、String を使用せずに、つまり次のようなものを使用せずに、Java I/O 操作でその機能を活用するにはどうすればよいでしょうか。

4

6 に答える 6

1

n簡単にするために、入力から読み取った長さ1の文字列があるとします。

operator+読み取り中にstrignsを使用するとString、文字列を連結するたびにオブジェクトが作成されるため、長さが1,2,3、...、nの文字列を取得します。

したがって、結合された文字列の合計メモリ使用量は、入力から読み取った文字列1 + 2 + .. + n = O(n^2)に追加されますn

一方StringBuilder、最終的な文字列を作成するために使用する場合、実際にはn、入力用に[長さ1のそれぞれ]、最終的な文字列用に1つのオブジェクトをサイズnで作成するため、合計メモリ使用量は1 + 1 + .. + 1 + n = O(n)

したがって、使用する場合でも(sb.append(String)スペースの使用量は、すべての中間文字列を作成するよりも漸進的に優れています)、中間文字列オブジェクトを作成する必要がないためです。

さらに、オブジェクトの作成数が少なく、メモリ使用量が少ないため、使用するとパフォーマンス[時間]が向上するはずStringBuilderです。gcは、文字列を単純に連結する場合ほどハードに動作する必要はありません。

(*)上記はどの長さの文字列にも当てはまることが簡単にわかります。

于 2012-03-24T17:38:21.923 に答える
0

実行している内容に応じて、必要な値がロードされ、クリアされてから再利用されるStringおよび/またはStringBuilderオブジェクトのプールを作成できます。プールを最大値まで拡張するように構成できます。プール内のオブジェクトが使用されていない場合は、それらをnullに設定すると、最終的にガベージコレクターによって再利用されます。

于 2012-03-24T17:35:55.280 に答える
0

次のようなことを検討することをお勧めします。

  BufferedReader reader = 
    new BufferedReader(
      new InputStreamReader(
        new ByteArrayInputStream(data)));
  String line;

  while ((line = reader.readLine()) != null)
    ...

詳細については、次のリンクを参照してください。

大きなByteBuffer用のBufferedReader?

http://www.tutorialspoint.com/java/java_bytearrayinputstream.htm

于 2012-03-24T17:40:09.407 に答える
0

Readerとそのサブクラスは char と char[] に基づいており、便利なメソッドのみが String を使用します。StringBuilder.append() は char[] を受け入れるため、char[] を中心に構築されたメソッドのみを使用すると、不要な String オブジェクトの作成を回避できます。

これにより、一時的に作成される String オブジェクトの数が減りますが、全体的なメモリ要件は変わりませんが、gc はそれ以外の方法で作成されたすべての String を収集することに注意してください。

于 2012-03-24T17:57:51.647 に答える
0

StringBuilders の append char メソッドを使用して、中間文字列の作成を回避するには、次の投稿を参照してください: https://stackoverflow.com/a/9849624/102483 final String を読み込んでいるファイルのサイズよりも小さくなるようにします。

于 2012-03-24T17:34:10.267 に答える
0

文字列の代わりにStringBuilder、ファイルから読み取ったデータを追加するために使用してみてください。使用Stringすると、メモリ内に複数の文字列オブジェクトが作成される可能性があります。

于 2012-03-24T18:09:38.620 に答える