【发布时间】:2019-04-08 02:38:33
【问题描述】:
什么是读取“大”文件(可能是文本或二进制文件)而不进入unsafe 领域的最有效的通用方法?当我在网络上搜索“rust read large file in chunks”时,我很惊讶有这么少的相关结果。
例如,我的一个用例是使用 rust-crypto 计算文件的 MD5 校验和(Md5 模块允许您迭代地添加 &[u8] 块)。
这是我所拥有的,它的性能似乎比其他一些方法(如read_to_end)略好:
use std::{
fs::File,
io::{self, BufRead, BufReader},
};
fn main() -> io::Result<()> {
const CAP: usize = 1024 * 128;
let file = File::open("my.file")?;
let mut reader = BufReader::with_capacity(CAP, file);
loop {
let length = {
let buffer = reader.fill_buf()?;
// do stuff with buffer here
buffer.len()
};
if length == 0 {
break;
}
reader.consume(length);
}
Ok(())
}
【问题讨论】:
-
为什么要关闭 fill_buf?我有这个关闭修复的问题。能否请您指出正确的方向。
-
@Townsheriff,你的意思是,为什么
reader.fill_buf()?在一个块中(let length = { ... })?如果是这样,那是因为 2016 年的借用检查器不像现在那么复杂。如果我将fill_buf和consume放在同一个范围内,rustc 会抱怨cannot borrow `reader` as mutable more than once at a time。fill_buf返回对底层读者的引用,因此将其置于较短的生命周期中可能会解决您的问题。 -
是的,这正是我在今天稳定的 rust 版本中遇到的。非常感谢和欢呼!