【问题标题】:How to handle processing large csv file or read large CSV file in chunks如何处理处理大型 csv 文件或分块读取大型 CSV 文件
【发布时间】:2015-10-10 10:43:44
【问题描述】:

我有非常大的 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 的可能重复项
  • 无论哪种方式,CsvToBean 都会将整个文件解析为一个列表并返回(根据我在谷歌上找到的来源)。如果你想处理一个任意大的文件,你需要一个解析器,它一次读取一行,一次返回一个 bean。

标签: java opencsv


【解决方案1】:

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

附言

在第二个sn-p中,不要使用原始的Iterator类型,使用Iterator&lt;MyObject&gt;

Iterator<MyObject> myObjects = csv.parse(strat, getReader("file.txt")).iterator();

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

【讨论】:

  • 所以听上去我需要使用迭代器方法并实现我自己的 CSVToBean。
  • 感谢您的提示,但使用迭代器似乎无法解决我的内存问题:/
  • @CodeJunkie 问题是您使用的csv 实例是否可以提供不需要先创建列表的Iterator(因为创建列表需要读取进步)。这样的迭代器(如果存在)可以按需从文件中读取数据(当您调用hasNext()next() 方法时)。
【解决方案2】:

一次读取大型 csv 文件并不是一个好的解决方案。分块读取 csv 文件的最佳方法。您可以有多个线程一个来从文件中读取数据,而其他几个线程来执行业务逻辑。更多关于分块读取 CSV 数据的细节在这里How to parse chunk by chunk a large CSV file and bulk insert to a database 并有多个线程解决方案here

【讨论】:

    【解决方案3】:

    “迭代器和列表有什么区别?”

    List 是一种数据结构,它为用户提供 get()、toArray() 等功能。

    迭代器只能允许用户在数据结构中导航,前提是数据结构实现了迭代器接口(所有数据结构都这样做)

    所以List&lt;MyOption&gt; myObjects = csv.parse(strat, getReader("file.txt")); 将数据物理存储在 myObjects 中

    Iterator myObjects = csv.parse(strat, getReader("file.txt")).iterator(); 只是使用了 csv.parse 的迭代器功能

    【讨论】:

      猜你喜欢
      • 2015-02-20
      • 2018-02-23
      • 2017-07-05
      • 2021-04-17
      • 2018-01-18
      • 2014-08-12
      • 2014-09-24
      • 2016-01-12
      相关资源
      最近更新 更多