Javaで多くのXMLファイルを読み取り、JSONに変換してファイルシステムに書き戻しています。XML フォルダーの合計サイズは約 100Gb で、単一の XML ファイルのサイズは約 100MB になる場合があります。JVM メモリのサイズは 512Mb に設定されています。ファイルの読み取りと書き込みのループは次のとおりです。
for(int i=0; i<fileNames.size(); i++) {
try{
File f = new File(File.separator+fileNames.get(i));
BufferedReader br = new BufferedReader(new FileReader(f));
String line;
StringBuilder sb = new StringBuilder();
long startTime = System.nanoTime();
while((line=br.readLine())!= null){
sb.append(line.trim());
}
String jsonData = XML.toJSONObject(sb.toString()).toString(0);
String outputFilename = fileNames.get(i).split("\\.")[0]+".json";
Path jsonFilePath = new Path(jsonPath+File.separator+outputFilename);
FSDataOutputStream out = fileSystem.create(jsonFilePath);
out.writeChars(jsonData);
byte[] b = jsonData.getBytes("UTF-8");
out.close();
br.close();
long endTime = System.nanoTime();
double executionTime = (double)(endTime - startTime) / 1000000000.0;
System.out.println("Input file : "+fileNames.get(i)+" - "+(double)(f.length()/1000) + " kb");
System.out.println("Output file : "+outputFilename+" - "+(double)(b.length/1000) + " kb"+" in "+executionTime + " seconds");
System.out.println("--------------------------------------------------");
}catch(IOException ioe){
ioe.printStackTrace();
}catch (JSONException je) {
System.out.println(je.toString());
}catch(Exception e){
e.printStackTrace();
}
}
しばらく実行した後、このプログラムは : をスロー Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
します。JVM メモリを -Xmx1024 に増やすと、プログラムの実行が非常に遅くなり、Java プロセスが大量のメモリを消費します。ファイル、stringbuilder、および bufferedreader を for ループで作成しているため、これらはメモリ内にあり、ガベージ コレクトされません。このコードを機能させるにはどうすればよいですか。ありがとう