2

大きなテキスト ファイルがありますが、改行がありません。長い文字列 (すべての ASCII 文字を含む 1 つの巨大な文字列行) が含まれているだけですが、これまでのところ、Java で行全体をメモリに読み込むことができるので、問題なく動作しますが、メモリがあるかどうか疑問に思っています。ファイルが5GB以上のように大きくなり、プログラムがファイル全体を一度にメモリに読み込むことができないため、リークの問題が発生します。その場合、そのようなファイルを読み取る最良の方法は何ですか? 巨大な線を 2 つの部分または複数のチャンクに分割できますか?

これが私がファイルを読む方法です

   BufferedReader buf = new BufferedReader(new FileReader("input.txt"));
   String line;
   while((line = buf.readLine()) != null){

   }
4

6 に答える 6

3

JVM には独自のガベージ コレクタがあるため、メモリ リークは発生しません。ただし、ヒープ領域が不足する可能性があります。

このような場合、ストリームを扱いやすい単位でインポートして処理することが常に最善です。64MB程度を読み込んで繰り返します。

JVM 内で使用可能な最大ヒープ領域を増やすために、-Xmxパラメーターを呼び出しに追加すると便利な場合もあります。java

于 2012-11-26T17:16:20.823 に答える
1

ファイルをチャンクで読み取ってから、チャンクを連結するか、必要なことを行う方が良いです。これは、読み取っているファイルが大きい場合、ヒープスペースの問題が発生するためです。

以下のようにそれを行う簡単な方法

  InputStream is;
  OutputStream os;

  byte buffer[] = new byte[1024];
  int read;
  while((read = is.read(buffer)) != -1)
  {
      // do whatever you need with the buffer
  }
于 2012-11-26T17:19:34.727 に答える
0

チャンクで読み取るという考え方に加えて、java.nio.MappedByteBuffer を使用してファイルのメモリ マッピング領域を確認することもできます。最大バッファ サイズは引き続き Integer.MAX_VALUE に制限されます。これは、チャンク内で分散アクセスを行う場合、チャンクを明示的に読み取るよりも優れている場合があります。

于 2012-11-26T17:41:27.797 に答える
-1

メモリ リークの問題は発生しませんが、ヒープ スペースの問題が発生する可能性があります。ヒープの問題を回避するには、バッファーを使用します。

それはすべて、現在行をどのように読んでいるかによって異なります。バッファを使用すると、すべてのヒープの問題を回避できます。

public void readLongString(String superlongString, int size, BufferedReader in){
  char[] buffer = new char[size];
  for(int i=0;i<superlongString.length;i+=size;){
       in.read(buffer, i, size)
       //do stuff 
     }
}
于 2012-11-26T17:24:36.903 に答える