作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我是一名优秀的程序员,十分优秀!