如何处理大型CSV文件或分块读取大型CSV文件

3
我有非常大的csv文件,我正在尝试迭代处理。我正在使用opencsv,并且希望使用CsvToBean以便可以动态地从数据库中设置列映射。我的问题是如何在不抓取整个文件并将其放入列表的情况下完成此操作。我正在尝试防止内存错误。
我目前正在将整个结果集传递到列表中,如下所示。
List<MyOption> myObjects = csv.parse(strat, getReader("file.txt"));

for (MyObject myObject : myObjects) {
    System.out.println(myObject);
}

但我发现了这个迭代器方法,我想知道它是否只会逐行迭代而不是一次性迭代整个文件?
Iterator myObjects = csv.parse(strat, getReader("file.txt")).iterator();

while (myObjects.hasNext()) {
    MyObject myObject = (MyObject) myObjects.next();
    System.out.println(myObject);
}

所以我的问题是,迭代器和列表之间有什么区别?

可能是 List vs List iterator 的重复问题。 - Subodh Joshi
https://dev59.com/T3I95IYBdhLWcg3w3iHG - Subodh Joshi
一次性读取大型csv文件并不是一个好的解决方案。最好的方法是分块读取csv文件。您可以有多个线程,一个用于从文件中读取数据,其他几个线程用于执行业务逻辑。有关如何分块读取CSV数据并批量插入到数据库的更多详细信息,请参见如何分块解析大型CSV文件并批量插入到数据库,以及多线程解决方案在这里 - Mukesh Singh Rathaur
1
无论如何,CsvToBean都会将整个文件解析为一个列表并返回(根据我在谷歌上找到的来源)。如果您想处理任意大小的文件,您需要一个逐行读取并逐个返回bean的解析器。 - slipperyseal
3个回答

1
“Iterator和List之间的区别是什么?”
“List是一种数据结构,提供了诸如get()、toArray()等功能。”
“迭代器只能允许用户在数据结构实现Iterator接口的情况下遍历数据结构(所有数据结构都实现了Iterator接口)。”
“因此,List<MyOption> myObjects = csv.parse(strat, getReader("file.txt"));将数据物理存储在myObjects中。”
“而Iterator myObjects = csv.parse(strat, getReader("file.txt")).iterator();则只使用csv.parse的迭代器功能。”

1
一次读取大型CSV文件并不是一个好的解决方案。最好的方法是分块读取CSV文件。您可以有多个线程之一从文件中读取数据,其他几个线程执行业务逻辑。有关按块读取CSV数据的更多详细信息,请参见 如何逐块解析大型CSV文件并批量插入数据库,以及多线程解决方案此处

1
增强型for循环(for (MyObject myObject : myObjects))是使用Iterator实现的(它要求由csv.parse(strat, getReader("file.txt"))返回的实例实现Iterable接口,该接口包含一个返回Iteratoriterator()方法),因此两个代码片段之间没有性能差异。

P.S

在第二个代码片段中,不要使用原始的Iterator类型,而是使用Iterator<MyObject>
Iterator<MyObject> myObjects = csv.parse(strat, getReader("file.txt")).iterator();

while (myObjects.hasNext()) {
    MyObject myObject = myObjects.next();
    System.out.println(myObject);
}

听起来我需要使用它们的迭代器方法并实现自己的CSVToBean。 - Code Junkie
谢谢你的建议,但似乎使用迭代器并不能解决我的内存问题 :/ - Code Junkie
@CodeJunkie 问题在于你使用的 csv 实例是否能够提供一个不需要先创建列表的 Iterator(因为创建列表需要预先读取所有数据)。这样的迭代器(如果存在)可以按需从文件中读取数据(当调用 hasNext()next() 方法时)。 - Eran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接