当前位置:  开发笔记 > 后端 > 正文

使用Serde和Bincode将大型结构序列化到磁盘的速度很慢

如何解决《使用Serde和Bincode将大型结构序列化到磁盘的速度很慢》经验,为你挑选了1个好方法。

我有一个结构,其中包含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直接写入文件。但是,编写过程确实很慢(大约半小时)。有没有办法加快速度?



1> m00am..:

这不是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倍)。


也许可以,但是我花了一些时间才找出问题所在。因此,这可能会使来自serde / bincode方面的人们更容易发现问题。
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有