11

我有一个包含 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();
}

为了避免两次分配内存,我serialize_into以前直接写入文件。但是,写的过程真的很慢(大约半个小时)。有没有办法加快这个速度?

4

1 回答 1

13

这不是 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();
}

对我来说,这将写作过程从大约半小时缩短到了 40 秒(加速了 50 倍)。

于 2018-04-23T14:01:40.723 回答