ホームページ  >  記事  >  Java  >  大きなファイルの読み取り時のメモリ オーバーフローに対する Java ソリューション

大きなファイルの読み取り時のメモリ オーバーフローに対する Java ソリューション

黄舟
黄舟オリジナル
2017-08-10 09:21:332562ブラウズ

次のエディタは、Java で大きなファイルを読み取る際のメモリ オーバーフローの問題を完全に解決する記事を提供します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして見てみましょう

1. 従来の方法: メモリ内でファイルの内容を読み取ります

ファイル行を読み取る標準的な方法は、Guava と Apache Commons IO の両方が提供する簡単な方法です。ファイル行の読み取りは次のとおりです。


Files.readLines(new File(path), Charsets.UTF_8); 
FileUtils.readLines(new File(path));

は、実際には BufferedReader またはそのサブクラス LineNumberReader を使用して読み取ります。

従来のアプローチの問題: ファイルが十分に大きいと、すぐにプログラムが OutOfMemoryError 例外をスローする原因となり、ファイルのすべての行がメモリに格納されることです。

問題について考える: 通常、ファイルのすべての行を一度にメモリに入れる必要はなく、ファイルの各行を走査して、対応する処理を実行するだけで済みます。処理後は捨ててください。したがって、すべての行をメモリに置くのではなく、行の反復によって読み取ることができます。

2. 大きなファイルの読み取り処理方法

繰り返し読み取りを行わず、メモリ不足を発生させずに大きなファイルを処理する:

(1) ファイルストリーミング方法: Scanner クラスを使用します。ファイルの内容を 1 行ずつ連続的に読み取ります


FileInputStream inputStream = null; 
Scanner sc = null; 
try { 
 inputStream = new FileInputStream(path); 
 sc = new Scanner(inputStream, UTF-8); 
 while (sc.hasNextLine()) {
  String line = sc.nextLine(); 
  // System.out.println(line); 
  } 
}catch(IOException e){
  logger.error(e);
}finally {
  if (inputStream != null) { 
  inputStream.close(); 
  } 
  if (sc != null) {
    sc.close();
   }
}

このソリューションは、ファイル内のすべての行を反復処理し、参照を維持せずに各行を処理できるようにします。 要するに、それらはメモリに保存されません。

(2) Apache Commons IO ストリーム: Commons IO ライブラリを使用して実装され、ライブラリ


LineIterator it = FileUtils.lineIterator(theFile, UTF-8); 
try {
 while (it.hasNext()) {
 String line = it.nextLine(); 
 // do something with line 
  } 
} finally {
 LineIterator.closeQuietly(it);
}

によって提供されるカスタム LineIterator を使用します。 この解決策は、ファイル全体 がすべてメモリに格納されていないためです これも結果としてメモリ消費量がかなり控えめになります。

以上が大きなファイルの読み取り時のメモリ オーバーフローに対する Java ソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。