我的程序中有一个大对象作为输入,我不想每次都初始化它。所以我尝试了Boost来序列化它(序列化后对象是13.6 MB)。但性能不是很好。它仍然需要大约一分钟来加载和反序列化它。所以我想知道有什么方法可以让这个过程更快吗?我提出任何提示或建议!提前谢谢你
这是保存功能:
void mysave(){
dataprepocess dp();//dp is the object i want to save and load
ofstream ofs("dp.dat", ios::binary);
{
boost::archive::binary_oarchive oa(ofs);
// write class instance to archive
oa << dp;
// archive and stream closed when destructors are called
}
cout<<"saving finished"<<endl;
}
这是我的加载功能,
void myload(dataprepocess& dp){
ifstream ifs1("dp_b.dat", ios::binary);
{
boost::archive::binary_iarchive ia1(ifs1);
ia1 >> dp;
}
ifs1.close();
}
我已经尝试过text_archive和binary_arhive,它证明了它们在性能方面没有太大差异。
答案 0 :(得分:2)
也就是说,反序列化可能很慢,具体取决于反序列化的类型。 速度取决于很多因素,很可能与使用的序列化库无关。
flat_map
进行连续存储,或者在加载完成后加载未分类和排序数据等。)您必须对代码进行分析,以找出性能瓶颈。
答案 1 :(得分:0)
您没有提供太多信息,因此只能给出一般答案。
据我所知,Boost喜欢序列化为XML, text, or a non-portable binary archives。在这三个中,我猜二进制存档是最快的,但看起来它无法从一台计算机可靠地传递到另一台计算机(Boost将其描述为非便携式)。二进制序列化通常比XML之类的文本更快,相比之下总是比较慢。
因此,如果您已经使用XML存档格式,则可以通过切换到二进制存档格式来提高速度。
如果您需要存档是可移植的,那么您将不得不放弃Boost并使用其他内容。
Google协议缓冲会让人想起。免费,便携和二进制(所以可能很快)。
ASN.1在我看来是一个非常好的选择,因为有一系列可移植的二进制表示,而且模式语言优于Google的Protocol Buffers。好的ASN.1工具不是免费的。