3

サイズが約300MBのファイルがあります。内容を1行ずつ読み込んでArrayListに追加したい。そのため、配列リスト a1 のオブジェクトを作成し、 BufferedReader を使用してファイルを読み取りました。その後、ファイルから行を ArrayList に追加すると、エラー Exception in thread "main" java.lang.OutOfMemoryError: Java heap space.

これに対する解決策を教えてください。

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
      FileReader file = new FileReader(
          "/home/dmdd/Desktop/AsiaData/RawData/AllupperairVcomponent.txt");
      ArrayList a1 = new ArrayList();
      BufferedReader br = new BufferedReader(file);
      String line = "";
      while ((line = br.readLine()) != null) {
        a1.add(line);
      }
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  }
4

7 に答える 7

4

素朴に、Xmxコマンドライン引数を使用してヒープのサイズを増やします(ガイダンスについては、この優れた回答を参照してください)

ただし、これはある程度までしか機能しません。代わりに、メモリ要件が最小限になるようにデータを構造化することを検討してください。一度にすべてをメモリに入れる必要がありますか? おそらく、アイテムがそのセットに含まれているかどうかをテストするだけで済みます。ハッシュまたはブルーム フィルター (など) の使用を検討してください。

于 2012-12-17T11:00:12.377 に答える
4

Javaのヒープサイズを増やすだけ

ジャバ -Xmx250m

プロジェクトを IDE から実行する場合は、引数に -Xmx250m を設定します。

250m は 250mb です

于 2012-12-17T11:02:26.687 に答える
2

メモリ内に保持する必要がある場合-mx、オプションをjava実行可能ファイルに渡してヒープ サイズを増やしてみてください。

また、メモリ内のすべてのデータを同時に必要とする場合は、この質問を検討する価値があるかもしれません。順番に処理するか、ほとんどまたはすべてをディスクに保持することができます。

于 2012-12-17T10:59:59.567 に答える
1

-Xmx1024m を渡して、ヒープ容量を 1024 mb に増やします。

java -Xms1024m -Xmx512m HelloWorld

32 ビット システムでは最大 4 GB まで増やすことができ、64 ビット システムではさらに大きくすることができます。

于 2012-12-17T11:00:37.507 に答える
0

@Muraliに部分的に同意します。これにより、直面している問題が修正されます。ただし、大きなファイルを処理する場合は、キャッシュを使用することをお勧めします。まれにファイルサイズが 500Mb になってしまったら?Memcachedなどのキャッシング API を利用すると、JVM でのメモリ不足が解消されます。

于 2012-12-17T11:05:42.500 に答える
0

できる場合: ファイルを 10000 行程度のバッチで処理します。

10k 行を読み取り、完了するまでプロセスを繰り返します

于 2012-12-17T11:15:10.987 に答える
0

java.nio.file.Files.readAllLines を使用すると、次のように返されますList<String>.。OOME を取得している場合は、ヒープ サイズを次のように増やします。java -Xmx1024m

于 2012-12-17T11:03:01.287 に答える