我有一个35GB的CSV
文件。我想读取每一行,如果符合条件,则将该行写到新的CSV中。
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("source.csv"))) {
try (BufferedReader br = Files.newBufferedReader(Paths.get("target.csv"))) {
br.lines().parallel()
.filter(line -> StringUtils.isNotBlank(line)) //bit more complex in real world
.forEach(line -> {
writer.write(line + "\n");
});
}
}
这大约需要。7分钟 是否可以进一步加快该过程?
1
是的,您可以尝试不使用Java来执行此操作,而是直接通过Linux / Windows / etc来执行。操作系统。Java是经过解释的,因此使用它总是会产生开销。除此之外,不,我没有任何明显的方法可以加快速度,而且35GB的7分钟对我来说似乎很合理。
—
蒂姆·比格勒伊森
也许删除
—
Thilo
parallel
使它更快?这不会使周围的线条混乱吗?
@TimBiegeleisen:“解释了Java”充其量是一种误导,而且几乎总是错误的。是的,对于某些优化,您可能需要离开JVM世界,但是用Java更快地执行此操作绝对是可行的。
—
约阿希姆·绍尔
您应该对应用程序进行概要分析,以查看是否有可以解决的热点。您将无法对原始IO做很多事情(默认的8192字节缓冲区还不错,因为涉及扇区大小等),但是可能(内部)正在发生某些事情,您可以一起工作。
—
卡亚曼