在不将整个文件一次加载到内存中的情况下,以块的形式读取大文件的最有效方法是什么?

问题描述 投票:10回答:1

读取“大”文件(可能是文本或二进制文件)的最有效的通用方法是什么,而不进入unsafe领域?当我在网上搜索“大块读取大块文件”时,我感到很惊讶。

例如,我的一个用例是使用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(())
}
file io rust
1个回答
7
投票

我不认为你可以编写比这更高效的代码。在fill_buf上的BufReader上的Filebasically just a straight call to read(2)

也就是说,当你使用它时,BufReader并不是真正有用的抽象;直接打电话给file.read(&mut buf)可能不那么尴尬。

© www.soinside.com 2019 - 2024. All rights reserved.