gpt4 book ai didi

csv - 惰性 CSV 过滤/解析 - 提高性能

转载 作者:行者123 更新时间:2023-12-02 01:21:57 24 4
gpt4 key购买 nike

延迟过滤 CSV 文件

我需要过滤数以百万计的日志记录,这些日志记录存储为大量的 CSV 文件。记录的大小大大超过了我的可用内存,所以我想采用一种惰性方法。

Java 8 流 API

借助 jdk8,我们拥有与 Apache commons-csv 配对的 Streams API,使我们能够轻松完成此任务。

public class LazyFilterer {

private static Iterable<CSVRecord> getIterable(String fileName) throws IOException {
return CSVFormat
.DEFAULT
.withFirstRecordAsHeader()
.parse(new BufferedReader(new FileReader(fileName)));
}

public static void main(String[] args) throws Exception {
File dir = new File("csv");

for (File file : dir.listFiles()) {
Iterable<CSVRecord> iterable = getIterable(file.getAbsolutePath());

StreamSupport.stream(iterable.spliterator(), true)
.filter(c -> c.get("API_Call").equals("Updates"))
.filter(c -> c.get("Remove").isEmpty())
.forEach(System.out::println);
}
}
}

性能

这张来自 VisualVM 的图表显示了使用比上面显示的更复杂的过滤管道1 解析 2.3 GB CSV 文件期间的内存使用情况。

如您所见,随着过滤的进行,内存使用量基本保持不变2

visualvm screenshot

您能否找到另一种方法来更快地完成相同的任务,同时又不增加代码的复杂性?

欢迎使用任何语言,Java 不一定是首选!

脚注

<子>[1] - 例如对于在 "API_Call" 上匹配的每个 CSVRecord 我可能需要进行一些 JSON 反序列化并在此之后进行额外的过滤,或者甚至为某些记录创建一个对象以促进额外的计算.

<子>[2] - 图表开头的空闲时间是 System.in.read(),用于确保 VisualVM 在计算开始前完全加载。

最佳答案

这对于仅 2.3GB 的数据来说太可怕了,我建议您尝试使用 uniVocity-parsers为了更好的表现?试试这个:

CsvParserSettings settings = new CsvParserSettings();
settings.setHeaderExtractionEnabled(true); // grabs headers from input

//select the fieds you are interested in. The filtered ones get in front to make things easier
settings.selectFields("API_Call", "Remove"/*, ... and everything else you are interested in*/);

//defines a processor to filter the rows you want
settings.setProcessor(new AbstractRowProcessor() {
@Override
public void rowProcessed(String[] row, ParsingContext context) {
if (row[0].equals("Updates") && row[1].isEmpty()) {
System.out.println(Arrays.toString(row));
}
}
});

// create the parser
CsvParser parser = new CsvParser(settings);

//parses everything. All rows will be sent to the processor defined above
parser.parse(file, "UTF-8");

我知道它不起作用,但它花了 20 秒 来处理我创建的一个 4 GB 文件来测试它,同时消耗 不到 75mb 整个时间的内存。从您的图形看来,对于较小的文件,您当前的方法似乎需要 1 分钟,并且需要 10 倍的内存。

试试这个例子,我相信它会有很大帮助。

免责声明,我是这个库的作者,它是开源和免费的(Apache 2.0 许可)

关于csv - 惰性 CSV 过滤/解析 - 提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39594923/

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