使用 Serde 和 Bincode 将大型结构序列化到磁盘很慢
Serialization of large struct to disk with Serde and Bincode is slow
我有一个包含 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
直接写入文件。不过写的过程真的很慢(大概半个小时)。有没有办法加快速度?
这不是 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 倍加速)。
我有一个包含 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
直接写入文件。不过写的过程真的很慢(大概半个小时)。有没有办法加快速度?
这不是 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 倍加速)。