我正在编写一个Java应用程序,该应用程序读取逗号分隔的文本文件,对数据进行一些计算并将更新的数据写入新文件。输入文件包含大约5亿行,所以我试图尽可能地扩展下面的内容,以便在运行时不会出现内存不足的异常。关于如何改进下面的任何想法?
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CsvTest {
public void readFile() {
BufferedReader br = null;
BufferedWriter out = null;
try {
br = new BufferedReader(new FileReader("C:\\input.txt"));
FileWriter fstream = new FileWriter("C:\\output.txt");
out = new BufferedWriter(fstream);
String line = null;
while ((line = br.readLine()) != null) {
out.write(line + "\r\n");
}
}
catch (FileNotFoundException ex) {
System.err.println("Error: " + ex.getMessage());
}
catch (IOException ex) {
System.err.println("Error: " + ex.getMessage());
}
finally {
try {
if (br != null) {
br.close();
}
if(out != null){
out.close();
}
}
catch (IOException ex) {
System.err.println("Error: " + ex.getMessage());
}
}
}
public static void main(String[] args) {
CsvTest test = new CsvTest();
test.readFile();
}
}
答案 0 :(得分:1)
您应该考虑使用java.nio.channels.FileChannel。还有标准java.io和java.nio的比较,例如this。 NIO似乎是进行大规模I / O操作的方法。
答案 1 :(得分:1)
您的代码非常好,我的意思是您将数据从输入流式传输到输出中,只在内存中保留一行,因此就内存要求而言,它基本上是O(1),你不能比这更好我认为。
相对于多gb文件的大小,内存使用情况,缓冲读取器和缓冲写入器中的缓冲区是常量,可忽略不计。
编辑:垃圾收集器应该可以很好地收集未使用的数据,至少我在类似的数据处理情况下使用它的经验非常积极。答案 2 :(得分:1)
out.write(line + "\r\n");
可以作为
out.write(line);
out.write("\r\n");
如果使用相同的对象值(如字符串)处理单元格,最好不要保存与多个对象实例相同的值。
private Map<Object, Object> sharedMap = new HashMap<Object, Object>();
public Object uniqueObject(Object value) {
Object sharedValue = sharedMap.get(value);
if (sharedValue == null) {
sharedValue = value;
sharedMap.put(sharedValue, sharedValue);
}
return sharedValue;
}