我有一个结构,其中包含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, 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(); }
为了避免两次分配内存,我曾经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, 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(); }
对我而言,这将写入过程从大约半小时缩短到40秒(加速50倍)。