gpt4 book ai didi

java - Apache Commons CSV 框架是否提供内存高效的增量/顺序模式来读取大文件?

转载 作者:行者123 更新时间:2023-11-30 01:49:57 25 4
gpt4 key购买 nike

Apache Commons CSV该项目非常适合解析逗号分隔值、制表符分隔数据和类似的数据格式。

我的印象是,该工具完全读取文件,并将生成的行对象保存在内存中。但我不确定,我找不到有关此行为的任何文档。

对于解析非常大的数据,我希望进行增量读取,一次一行,或者一次可能相对较少的行数,以避免压倒性的内存限制。

仅就内存使用方面而言,这里的想法就像 XML 的 SAX 解析器如何增量读取以最大限度地减少 RAM 的使用,而 DOM 样式的 XML 解析器则将文档完全读入内存以提供树遍历。

问题:

  • Apache Commons CSV 在读取文档方面的默认行为是什么:完全读入内存还是增量读入?
  • 可以在增量文档和整个文档之间更改此行为吗?

最佳答案

My impression is that this tool reads a file entirely with the resulting line objects kept in memory

没有。内存的使用取决于您选择与 CSVParser 对象交互的方式。

CSVParser 的 Javadoc在解析记录解析到内存部分中明确解决了这个问题,但要注意:

Parsing into memory may consume a lot of system resources depending on the input. For example if you're parsing a 150MB file of CSV data the contents will be read completely into memory.

我快速浏览了源代码,实际上解析记录似乎是一次从其输入源读取一个 block ,而不是一次全部读取。但是see for yourself .

明智地解析记录

解析记录部分中,它展示了如何通过循环 Iterable 一次增量读取一个 CSVRecord那是CSVParser

CSVParser parser = CSVParser.parse(csvData, CSVFormat.RFC4180);
for (CSVRecord csvRecord : parser) {
...
}

解析到内存

相比之下,解析到内存部分显示了 CSVParser::getRecords 的使用将所有 CSVRecord 对象一次性加载到内存中的 List 中。显然,非常大的输入文件可能会耗尽受限机器上的内存。

Reader in = new StringReader("a;b\nc;d");
CSVParser parser = new CSVParser(in, CSVFormat.EXCEL);
List<CSVRecord> list = parser.getRecords();

关于java - Apache Commons CSV 框架是否提供内存高效的增量/顺序模式来读取大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56427676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com