タブ区切り文字列の行が多いファイルから読み取る次のJAVAクラスがあります。行の例は次のようになります。
GO:0085044 GO:0085044 GO:0085044
コードは各行を読み取り、split関数を使用して3つのサブ文字列を配列に配置し、次にそれらを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());
}
}
}
プログラムを実行すると、しばらく実行した後、次の実行時エラーが発生しました。メモリ使用量が増え続けていることに気づきました。
スレッド「main」の例外java.lang.OutOfMemoryError:java.util.regex.Pattern。(Pattern.java:1150)のjava.util.regex.Pattern.compile(Pattern.java:1469)でGCオーバーヘッド制限を超えました。 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パラメーターを試しましたが、それは役に立ちませんでした。したがって、コードにメモリリークがあると思いますが、見つかりません。
誰かがこれについて私を助けることができますか?前もって感謝します!