gpt4 book ai didi

java - 如何逐行复制大数据文件?

转载 作者:行者123 更新时间:2023-12-02 15:00:23 24 4
gpt4 key购买 nike

我有一个 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分钟。是否有可能进一步加快该过程?

最佳答案

如果可以的话,您可以使用 GZipInputStream/GZipOutputStream 来最小化磁盘 I/O。

Files.newBufferedReader/Writer 使用默认缓冲区大小,我相信是 8 KB。您可以尝试更大的缓冲区。

转换为字符串、Unicode 会减慢速度(并使用两倍的内存)。使用的UTF-8并不像StandardCharsets.ISO_8859_1那么简单。

最好的情况是,您可以在大部分情况下使用字节,并且仅针对特定的 CSV 字段将它们转换为字符串。

内存映射文件可能是最合适的。文件范围可能会使用并行性,从而吐出文件。

try (FileChannel sourceChannel = new RandomAccessFile("source.csv","r").getChannel(); ...
MappedByteBuffer buf = sourceChannel.map(...);

这将变得有点多的代码,在 (byte)'\n' 上获取行,但不会过于复杂。

关于java - 如何逐行复制大数据文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58501500/

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