Сериализация большой структуры на диск с помощью Serde и Bincode происходит медленно

У меня есть структура, которая содержит вектор 2³¹ u32 значения (общий размер около 8 ГБ). Я следовал за 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 напрямую записать в файл. Тем не менее, процесс записи действительно медленный (около получаса). Есть ли способ ускорить это?

1 ответ

Решение

Это не проблема с serde и / или bincode. В отличие от некоторых других языков, Rust не использует буферизованный ввод / вывод по умолчанию (подробности см. В этом вопросе). Следовательно, производительность этого кода может быть значительно увеличена с помощью буферизированного модуля записи:

#[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 раз).

Другие вопросы по тегам