【发布时间】:2014-09-30 20:04:14
【问题描述】:
我想通过 Java 读取一个巨大的 csv 文件。它包括 75,000,000 行。问题是,即使我使用最大 xms 和 xmx 限制,我得到:`java.lang.OutOfMemoryError(GC 开销限制超出),它显示此行导致错误:
String[][] matrix = new String[counterRow][counterCol];
我做了一些测试,发现我可以很好地阅读 15,000,000 行。因此我开始使用这种代码:
String csvFile = "myfile.csv";
List<String[]> rowList = new ArrayList();
String line = "";
String cvsSplitBy = ",";
BufferedReader br = null;
try {
int counterRow = 0, counterCol = 12, id = 0;
br = new BufferedReader(new FileReader(csvFile));
while ((line = br.readLine()) != null) {
String[] object = line.split(cvsSplitBy);
rowList.add(object);
counterRow++;
if (counterRow % 15000000 ==0) {
String[][] matrix = new String[counterRow][counterCol];
.. do processes ..
SaveAsCSV(matrix,id);
counterRow=0; id++; rowList.clear();
}
}
}
...
在这里,前 15.000.000 行写得很好,但在第二次试验中,这再次给出了同样的错误,尽管 counterRow 是 15,000,000。
总之,我需要在 Java 中读取一个包含 75,000,000 行(约 5 GB)的csv 文件,并在对其记录进行一些处理后保存一个新的csv 文件或多个文件。
我该如何解决这个问题?
谢谢
编辑:我也在使用 rowList.clear() 家伙,忘了在这里指定。对不起。
编辑 2:我的朋友们,我不需要将所有文件都放在内存中。我怎样才能部分地阅读它。实际上,这就是我尝试使用 if(counterRow%15000000==0) 来做的事情。它的正确方法是什么?
【问题讨论】:
-
内存中的数据量非常大 - 为什么不尝试写入数据库,然后查询呢?
-
你绝对不能把整个该死的文件都带入内存。可以分批/分批处理文件吗?
-
如果你的文件是 5GB 并且你想把它保存在内存中,我认为你需要 5 GB 的 RA%,巨大的 ^^
-
streaming是你这里最好的朋友