如何使用Java中的解析器在内存不足的情况下解析csv?

如何使用Java中的解析器在内存不足的情况下解析csv?,java,csv,parsing,inputstream,memory-efficient,Java,Csv,Parsing,Inputstream,Memory Efficient,我使用了InputStream,在解析时,如果一列中有一个“”,“”,那么它会将其视为一个单独的列。 ex-abc,xyz,“m,n” 然后解析的输出是abc、xyz、m、n 这里m和n被视为独立的列。我非常喜欢Apache Commons。这几乎是他们用户指南中的逐字记录: Reader reader = new FileReader("input.csv"); final CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT);

我使用了InputStream,在解析时,如果一列中有一个“
”,“
”,那么它会将其视为一个单独的列。 ex-
abc,xyz,“m,n”
然后解析的输出是abc、xyz、m、n
这里m和n被视为独立的列。

我非常喜欢Apache Commons。这几乎是他们用户指南中的逐字记录:

Reader reader = new FileReader("input.csv");
final CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT);
try {
    for (final CSVRecord record : parser) {
        final String string = record.get("SomeColumn");
        ...
    }
} finally {
    parser.close();
    reader.close();
}
这是简单的、可配置的和面向行的

您可以这样配置它:

final CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.withHeader().withDelimiter(';'));
对于记录,此配置是不必要的,因为
CSVFormat.DEFAULT
的工作方式完全符合您的要求


这将是我第一次尝试看它是否适合记忆。如果没有,你能更具体一点关于低内存占用吗?

有很多第三方Csv解析库,比如


  • 我正在使用UniVocity csv解析器,它非常快速,可以自动检测行中的分隔符。您可以浏览以上给定的csv库。

    也许是一种可能性。或者像这样的扫描仪生成器。不过,你必须知道如何为CSV文件的语法设置它们;它们不是“开箱即用”的解决方案。文件的数据结构是什么?解析后的结果应该如何处理?程序可以消耗多少内存?解析CSV不需要太多内存。你需要的是存储所有的内存。解决方法:不要。一次处理一行。感谢回复CSVParser将整个文件加载到内存中,这是一个问题。如果文件大小是1GB,那么内存消耗已经是1GB左右了。@有些CSVParser可以同时做这两件事:将所有内容读入内存,以及按记录读取。看@somey你怎么解析它?这部分代码也可以将内容读入内存。你能告诉我们你是怎么做的吗?此外,您还可以连接
    jvisualvm
    ,查看到底是什么消耗了这么多内存。也许需要gc运行?