gpt4 book ai didi

file - 在 Rust 中迭代文件字节的更快方法是什么?

转载 作者:行者123 更新时间:2023-12-05 01:30:54 25 4
gpt4 key购买 nike

我是 Rust 的新手,我正在尝试想出一个简单的备份程序。第一步,文件被分解成可变长度的 block (通过 content-defined chunking )。

为此,我必须逐字节读取文件。不幸的是,我发现这个过程非常缓慢。使用 dd 我可以以高达 350 MiB/s 的速度读取。尽管如此,使用以下 Rust 代码我只能得到大约 45 MiB/s。 (我在那里遗漏了所有分 block 的东西。)

我正在阅读的文件大小约为 7.7 GiB。

// main.rs


use std::fs::File;
use std::io::BufReader;
use std::io::{Read, Bytes};
use std::time::{Instant, Duration};

fn main() {
let file = File::open("something_big.tar").expect("Cannot read file.");

let mut buf = BufReader::new(file);

let mut x = 0u8;

let mut num_bytes = 0usize;

let t1 = Instant::now();

for b in buf.bytes() {
match b {
Ok(b) => {
x += b;
num_bytes += 1;
// chunking stuff omitted
},
Err(_) => panic!("I/O Error")
}
}

let dur = t1.elapsed().as_secs_f64();
let mut num_bytes = (num_bytes as f64) / 1_048_576f64;

println!("RESULT: {}", x);

println!("Read speed: {:.1} MiB / s", num_bytes / dur);
}

问题:使用 Rust 快速遍历文件字节的更好方法是什么?我的代码有什么问题?

我知道也许我可以使用 memmap crate 或类似的东西——但是:我不想那样做。

最佳答案

我不确定为什么会这样,但我发现从 BufReader 手动 read()ing 时速度要快得多。对于下面的 512 字节数组,我看到大约 2700MiB/s,对于单字节数组,它大约是 300 MiB/s。

Bytes 迭代器显然会产生一些开销,此实现或多或少是从其 IntoIterator 实现中复制粘贴的。

use std::fs::File;
use std::io::{BufReader, ErrorKind};
use std::io::Read;
use std::time::Instant;

fn main() {
let file = File::open("some-3.3gb-file")
.expect("Cannot read file.");

let mut buf = BufReader::new(file);

let mut x = 0u8;

let mut num_bytes = 0usize;

let t1 = Instant::now();

let mut bytes = [0; 512];
loop {
match buf.read(&mut bytes) {
Ok(0) => break,
Ok(n) => {
for i in 0..n {
num_bytes += 1;
x += bytes[i];
}
}
Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
Err(e) => panic!("{:?}", e),
};
}

let dur = t1.elapsed().as_secs_f64();
let mut num_bytes = (num_bytes as f64) / 1_048_576f64;

println!("RESULT: {}", x);

println!("Read speed: {:.1} MiB / s for {}", num_bytes / dur, num_bytes);
}

关于file - 在 Rust 中迭代文件字节的更快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66645551/

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