【问题标题】:Limit CsvListReader to one line将 CsvListReader 限制为一行
【发布时间】:2013-03-05 12:16:30
【问题描述】:

我正在开发处理大型 CSV 文件(数百 MB)的应用程序。最近我遇到了一个问题,起初看起来像是应用程序中的内存泄漏,但经过一番调查,它似乎是格式错误的 CSV 和 CsvListReader 尝试解析永无止境的行的组合。结果,我得到了以下异常:

at java.lang.OutOfMemoryError.<init>(<unknown string>)
at java.util.Arrays.copyOf(<unknown string>)
   Local Variable: char[]#13624
at java.lang.AbstractStringBuilder.expandCapacity(<unknown string>)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(<unknown string>)
at java.lang.AbstractStringBuilder.append(<unknown string>)
at java.lang.StringBuilder.append(<unknown string>)
   Local Variable: java.lang.StringBuilder#3
at org.supercsv.io.Tokenizer.readStringList(<unknown string>)
   Local Variable: java.util.ArrayList#642
   Local Variable: org.supercsv.io.Tokenizer#1
   Local Variable: org.supercsv.io.PARSERSTATE#2
   Local Variable: java.lang.String#14960
at org.supercsv.io.CsvListReader.read(<unknown string>)

通过根据转储结果分析堆转储和 CSV 文件,我注意到 CSV 行中的一列缺少右引号,这显然导致读者试图通过将文件内容附加到内部字符串来查找行尾缓冲区,直到没有更多的堆内存。

无论如何,这就是问题所在,这是由于 CSV 格式错误 - 一旦我删除了关键行,问题就消失了。我想要达到的目的是告诉读者:

  • 它应该解释的所有内容总是以换行符结尾,即使引号没有正确关闭(不支持多行)
  • 或者,提供 CSV 行的特定限制(以字节为单位)

在 SuperCSV 中使用 CsvListReader 是否有一些明确的方法(在我的情况下是首选)?

【问题讨论】:

    标签: supercsv


    【解决方案1】:

    issue 已被报告,我目前正在开发一些增强功能(用于未来的主要版本),这将使这两个选项更容易一些。

    现在,您必须向阅读器提供您自己的 Tokenizer(因此 Super CSV 使用您的而不是它自己的)。我建议复制 Super CSV 的 Tokenizer 并根据您的更改进行修改。这样您就不必修改 Super CSV,也不会浪费时间。

    【讨论】:

    • 感谢您的回答,对 Tokenizer 进行细微更改并按照您的建议使用它可以防止内存问题并根据我的用例调整 Super CSV。也许创建更多可配置的标记器并使其成为 Super CSV 库的标准部分是个好主意。我很乐意为此提供帮助。
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2014-11-27
    • 1970-01-01
    • 2014-04-11
    • 2012-06-14
    相关资源
    最近更新 更多