多くのタブ区切りの文字列を含むファイルから読み込むには、次のJAVAクラスがあります。例えば、行は以下のようである:java.lang.OutOfMemoryErrorを使用したJAVA処理ファイル:GCオーバーヘッドの上限を超えたエラー
GO:0085044 GO:0085044 GO:0085044
コードが各行を読み取り、配列に三つのサブ文字列を入れて、分割機能を使用し、それは2つのレベルハッシュにそれらを置きます。
public class LCAReader {
public static void main(String[] args) {
Map<String, Map<String, String>> termPairLCA = new HashMap<String, Map<String, String>>();
File ifile = new File("LCA1.txt");
try {
BufferedReader reader = new BufferedReader(new FileReader(ifile));
String line = null;
while((line=reader.readLine()) != null) {
String[] arr = line.split("\t");
if(termPairLCA.containsKey(arr[0])) {
if(termPairLCA.get(arr[0]).containsKey(arr[1])) {
System.out.println("Error: Duplicate term in LCACache");
} else {
termPairLCA.get(arr[0]).put(new String(arr[1]), new String(arr[2]));
}
} else {
Map<String, String> tempMap = new HashMap<String, String>();
tempMap.put(new String(arr[1]), new String(arr[2]));
termPairLCA.put(new String(arr[0]), tempMap);
}
}
reader.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
私がプログラムを実行したとき、私は実行時に次のエラーが発生しました。私はメモリ使用量が増加し続けていることに気づいた。スレッド内
例外 "メイン" java.lang.OutOfMemoryErrorを:GCオーバーヘッドの制限はjava.util.regex.Patternのにjava.util.regex.Pattern.compile(Pattern.java:1469) にを超えて(パターン。 .java:1150) at java.util.regex.Pattern.compile(Pattern.java:840) at java.lang.String.split(String.java:2304) at java.lang.String.split(String .java:2346) at LCAReader.main(LCAReader.java:17)
入力ファイルはほぼ2Gで、マシンを実行すると8Gのメモリがあります。私はまた、プログラムを実行するために-Xmx4096mパラメータを試しましたが、それは助けになりませんでした。だから私はコード内にいくつかのメモリリークがあると思いますが、私はそれらを見つけることができません。
誰もが私にこれを助けることができますか?前もって感謝します!
'String.split()'を使用しているときには、 'new String()'を慎重に注意してください。 'String.split()'の結果から少数のトークンだけが必要な場合、 'String.split()'によって返される 'Strings'は単純にラッパーであるため、' new String() 'を使うのは良い考えです。分割された文字列全体を指します。だから、もしあなたが望むものがいくつかあったとしても、ヒープに文字列全体を残すことになります( 'String'ではなく' \ t'セパレータ)。 – ulmangt
私はintern()メソッドを試して、ヒープサイズを6Gに増やしました。例外は表示されません。メモリ使用量から、私はそれがまだ多くのメモリを使用することがわかります。ヒープサイズの増加は多くの助けになり、internメソッドはほとんど役に立たなかった。ありがとう! – Wei