【问题标题】:Fastest way to read a CSV?读取 CSV 的最快方法?
【发布时间】:2014-09-26 05:55:14
【问题描述】:

我已经分析了我的应用程序,目前我最大的瓶颈之一似乎是String.split 方法。它占用了我 21% 的运行时间,而其他主要贡献者不再是我可以简化的部分。似乎所有新创建的 String 对象都导致垃圾收集器出现问题,尽管我不太清楚是否是这种情况。

我正在读取包含财务数据的 gzip 压缩文件中的逗号分隔值。每行中的字段数取决于它是什么类型的记录,每个字段的大小也不同。什么是读取数据的最快方法,创建最少的中间对象?

我看到了this thread,但没有任何答案表明 OpenCSV 比 String.split 快,而且他们似乎都专注于使用外部库而不是编写新代码。我也非常担心内存开销,因为我将总运行时的另外 20% 左右用于垃圾收集。我只想返回有问题的字符串的视图,但它是looks like that's not possible anymore

【问题讨论】:

  • 您的数据总是整数?如果您的数据包含字符串,如果它包含诸如“Hello, world!”之类的字符串,您的代码将失败
  • @MarcoAcierno 不,它们大多不是整数。一些字符串,一些浮点数,一些整数。
  • 问题是使用Split 你也会拆分字符串。 (你应该确保字符串不会有 , 里面)
  • 是的,我确定。字符串类似于股票行情。

标签: java csv


【解决方案1】:

更快捷的方法是使用简单的StringTokenizer。它没有split() 的正则表达式开销,它在JDK 中。

【讨论】:

    【解决方案2】:

    如果您不想使用库,那么StringTokenizer 的替代方法是编写一个简单的状态机来解析您的 CSV。标记器可能会遇到嵌入在字段中的逗号问题。 CSV 是一种相当简单的格式,因此构建状态机来处理它并不难。如果您确切知道输入文件的格式是什么,那么您可以进一步简化它,因为您不必处理特定文件中不存在的任何可能性。

    数字数据可能会即时直接转换为int,而无需同时保存大量字符串。

    【讨论】:

      【解决方案3】:

      使用uniVocity-parsers 解析您的CSV 文件。它是用于表格文本格式的解析器套件,其 CSV 解析器是所有其他 Java 解析器中最快的(如您所见 herehere)。披露:我是这个库的作者。它是开源免费的(Apache V2.0 许可)。

      我们使用此框架提供的架构为this project 的 MySQL 转储文件构建了一个自定义解析器。我们设法在 15 分钟内解析了一个 42GB 的转储文件(超过十亿行)。

      应该可以解决你的问题。

      【讨论】:

        猜你喜欢
        • 2014-10-04
        • 2019-07-31
        • 2015-09-13
        • 2021-10-15
        • 2011-05-21
        • 1970-01-01
        • 2015-06-10
        • 1970-01-01
        • 2012-05-17
        相关资源
        最近更新 更多