m00*_*0am 5 io performance file rust serde
我有一个结构,其中包含2³¹ u32值的向量(总大小约为8GB)。我按照bincode示例将其写入磁盘:
#[macro_use]
extern crate serde_derive;
extern crate bincode;
use std::fs::File;
use bincode::serialize_into;
#[derive(Serialize, Deserialize, PartialEq, Debug)]
pub struct MyStruct {
counter: Vec<u32>,
offset: usize,
}
impl MyStruct {
// omitted for conciseness
}
fn main() {
let m = MyStruct::new();
// fill entries in the counter vector
let mut f = File::create("/tmp/foo.bar").unwrap();
serialize_into(&mut f, &m).unwrap();
}
Run Code Online (Sandbox Code Playgroud)
为了避免两次分配内存,我曾经serialize_into直接写入文件。但是,编写过程确实很慢(大约半小时)。有没有办法加快速度?
这不是Serde和/或Bincode的问题。与其他一些语言不同,Rust默认情况下不使用缓冲的I / O(有关详细信息,请参见此问题)。因此,使用缓冲的编写器可以显着提高此代码的性能:
#[macro_use]
extern crate serde_derive;
extern crate bincode;
use std::fs::File;
use bincode::serialize_into;
use std::io::BufWriter;
#[derive(Serialize, Deserialize, PartialEq, Debug)]
pub struct MyStruct {
counter: Vec<u32>,
offset: usize,
}
impl MyStruct {
// omitted for conciseness
}
fn main() {
let m = MyStruct::new();
// fill entries in the counter vector
let mut f = BufWriter::new(File::create("/tmp/foo.bar").unwrap());
serialize_into(&mut f, &m).unwrap();
}
Run Code Online (Sandbox Code Playgroud)
对我而言,这将写入过程从大约半小时缩短到40秒(加速50倍)。