Eigen - 如何创建最小的序列化MatrixXf

时间:2017-07-10 05:22:23

标签: c++ qt serialization eigen

我通过类似的代码将相对较大的MatrixXf序列化为文件 - https://github.com/github188/vidy_old/blob/01c0aa4242299f7f1056edf0aa60b92177dfcfe6/3rdparty/openbr/core/eigenutils.h

当我使用Qt执行此操作时,它会根据矩阵创建一个3-30MB的文件。

如果节省空间是我的第一目标,我可以考虑做些什么?

  1. 是否有其他形式的序列化,我希望看到更小的文件大小? (我可能会尝试提升,看看它有何不同 - https://gist.github.com/ShigekiKarita/4db2b0ffb207322c1324
  2. 如果我可以使用较少的浮点精度小数位,那么序列化矩阵似乎可以被压缩一点,因此它不必存储在磁盘上。有谁知道这种技术吗?
  3. 谢谢你,

2 个答案:

答案 0 :(得分:1)

使用boost的iostream过滤来提升序列化和压缩功能,可以为您提供灵活的解决方案,文件很小。

Boost序列化的binary_archive非常紧凑,并且允许文件版本化,这可以很方便。

答案 1 :(得分:0)

独立于您正在使用的序列化,boost提供了过滤流,其工作方式与常规的istream和ostream完全相同,但是动态添加压缩。您可以简单地将示例中的流替换为已过滤的流,并且应该具有工作压缩。

http://www.boost.org/doc/libs/1_64_0/libs/iostreams/doc/classes/gzip.html

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>

int main() 
{
    using namespace std;

    ifstream file("hello.gz", ios_base::in | ios_base::binary);
    filtering_streambuf<input> in;
    in.push(gzip_decompressor());
    in.push(file);
    boost::iostreams::copy(in, cout);
}