gpt4 book ai didi

Java - 读取巨大的 csv 文件时出现 OutofMemoryError

转载 作者:行者123 更新时间:2023-12-01 17:06:51 25 4
gpt4 key购买 nike

我想用Java读取一个巨大的csv文件。它包括 75,000,000 行。问题是,即使我使用最大 xmsxmx 限制,我得到:`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:我的 friend 们,我不需要将所有文件放入内存中。我怎样才能部分地阅读它。实际上,这就是我尝试使用 if(counterRow%15000000==0) 所做的事情。正确的做法是什么?

最佳答案

您可以单独读取各行,然后进行处理,直到读取整个文件

String encoding = "UTF-8";
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("/bigfile.txt"), encoding));
String line;
while ((line = br.readLine()) != null) {
// process the line.
}
br.close();

这不应该是错误的,只要确保立即处理它并且不要将其存储在循环之外的变量中

关于Java - 读取巨大的 csv 文件时出现 OutofMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25184911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com