我已经分析了我的应用程序,目前我最大的瓶颈之一似乎是String.split
方法。它占据了我运行时的21%,而其他主要贡献者并不是我可以简化的部分。看起来所有新创建的String
对象都会导致垃圾收集器出现问题,尽管我不清楚是否是这种情况。
我正在阅读包含财务数据的gzip文件以逗号分隔的值。每行中的字段数取决于它的记录类型,每个字段的大小也不同。什么是读取数据的最快方法,创建最少的中间对象?
我看到了this thread但是没有一个答案能够证明OpenCSV比String.split
更快,而且它们似乎都专注于使用外部库而不是编写新代码。我也非常关心内存开销,因为我花了另外20%左右的总运行时间进行垃圾收集。我想只返回有问题的字符串的视图,但它looks like that's not possible anymore。
答案 0 :(得分:1)
更快捷的方法是只使用简单的StringTokenizer
。它没有split()
的正则表达式开销,而且它在JDK中。
答案 1 :(得分:0)
如果您不想使用库,那么StringTokenizer
的替代方法是编写一个简单的状态机来解析您的CSV。标记符可能会出现嵌入字段的逗号的问题。 CSV是一种相当简单的格式,因此构建状态机来处理它并不困难。如果您确切知道输入文件的格式是什么,那么您可以进一步简化它,因为您不必处理特定文件中没有的任何可能性。
数字数据可能会直接转换为int
,而无需同时保存大量字符串。
答案 2 :(得分:0)
使用uniVocity-parsers解析您的CSV文件。它是表格文本格式的解析器套件,其CSV解析器是所有其他Java解析器中最快的(如您所见here和here)。披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。
我们使用此框架提供的体系结构为this project的MySQL转储文件构建自定义解析器。我们设法在15分钟内解析了一个42GB的转储文件(超过10亿行)。
它应该可以解决你的问题。