Rust 分块读取文件的更快方法

Rust 分块读取文件的更快方法,rust,rust-tokio,Rust,Rust Tokio,我希望以块的形式读取文件(>1GB),但不将其保存到内存中,这样我就可以使用尽可能少的资源来流式处理每个块 对于以10MB的块读取文件,我使用以下方法: 使用anyhow::Result; 使用futures::stream::FuturesUnordered; 使用std::fs::元数据; 使用std::io::SeekFrom; 使用std::time::Instant; 使用std::{env,process::exit}; 使用tokio::fs::File; 使用tokio::io:

我希望以块的形式读取文件(>1GB),但不将其保存到内存中,这样我就可以使用尽可能少的资源来流式处理每个块

对于以
10MB的块读取文件,我使用以下方法:

使用anyhow::Result;
使用futures::stream::FuturesUnordered;
使用std::fs::元数据;
使用std::io::SeekFrom;
使用std::time::Instant;
使用std::{env,process::exit};
使用tokio::fs::File;
使用tokio::io::AsyncReadExt;
使用tokio::stream::StreamExt;
使用tokio_util::codec::{BytesCodec,FramedRead};
#[tokio::main]
异步fn main()->结果{
让现在=瞬间::现在();
让args:Vec=env::args().collect();
如果args.len()小于2{
eprintln!(“缺少参数:file”);
出口(1);
}
让文件路径=&args[1];
让fsize=metadata(&file_path).map(|m | m.len()).unwrap();
让mut chunk_size=10_485_760;
普林顿(
“文件大小:{},块大小:{},部分:{}”,
fsize,
块大小,
fsize/chunk\u大小
);
让mut搜索:u64=0;
让mut部分:Vec=Vec::new();
而seek
我将任务限制为最多4个,以防止
打开的文件过多
错误

代码正常工作,但在我的系统中使用SATA磁盘读取(
4466092032
)的文件平均需要230秒

我还尝试了
tokio::task::spawn(…)
,但速度差不多


你知道如何改进编码,使其能够更快地读取文件吗?

我认为这不是一个特定于锈蚀的问题……请参阅相关的QA:强制性问题,你是在发布模式下编译的吗?是的,并且使用
货物运行测试--release/path/to/file
你能尝试一下类似
time cat/path/to/file>/dev/null这样的命令吗是否用作基线?仅使用单个线程和同步IO可能会获得更好的结果。具有异步运行时的磁盘IO不快,因为它需要在异步运行时线程和线程池线程之间进行跳转。尝试并行读取文件的多个块并不快,因为它会在运行期间强制continuos查找IO和磁盘(及其驱动程序)针对顺序IO而不是查找进行了优化