Сериализация большой структуры на диск с помощью 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 раз).