【发布时间】:2020-02-18 10:34:18
【问题描述】:
我有一个 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 分钟。是否有可能进一步加快这一进程?
【问题讨论】:
-
是的,您可以尝试不在 Java 中执行此操作,而是直接从您的 Linux/Windows/etc 中执行此操作。操作系统。 Java 是解释型的,使用它总会有开销。除此之外,不,我没有任何明显的方法来加速它,35GB 的 7 分钟对我来说似乎是合理的。
-
也许删除
parallel会更快?这不是打乱线吗? -
自己创建
BufferedWriter,使用constructor,让您设置缓冲区大小。也许更大(或更小)的缓冲区大小会有所作为。我会尝试将BufferedWriter缓冲区大小与主机操作系统缓冲区大小相匹配。 -
@TimBiegeleisen:“Java 被解释”充其量只是误导,而且几乎总是错误的。是的,对于某些优化,您可能需要离开 JVM 世界,但是在 Java 中更快地做到这一点绝对是可行的。
-
您应该对应用程序进行概要分析,以查看是否有任何热点可以解决。您将无法对原始 IO 做太多事情(默认的 8192 字节缓冲区并没有那么糟糕,因为涉及到扇区大小等),但可能会发生一些事情(内部),您可能能够做到一起工作。
标签: java java-stream java-io