我正在用 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 进程消耗大量内存。因为我在 for 循环中创建文件、stringbuilder 和 bufferedreader,所以它们都在内存中,它们不会被垃圾收集。我怎样才能使这个代码工作。谢谢