【问题标题】:boost mpi serialization compressboost mpi序列化压缩
【发布时间】:2014-06-07 12:28:50
【问题描述】:

我正在寻找一种方法来压缩 boost.MPI 广播、分散、收集请求中的序列化数据。要发送的类包含需要通过无线网络传输的大量数据(400MB)。虽然它确实发送,但它需要> 20分钟。一种前进的方法是压缩数据,这在 boost 压缩存档中是可能的(见下文)。你知道 boost.MPI 是否存在类似的压缩方法吗?如果没有,除了实现文件服务器之外,还有什么关于发送这么多数据的建议吗?

示例要发送的类

class big {
    ...
    template<class Archive> void serialize(Archive & ar, const unsigned int version){
        ar & big_element1;
        ar & big_element2;
    }
}

示例提升压缩存档

std::ifstream ifs(fname, std::ios::binary);
boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
in.push(boost::iostreams::zlib_decompressor());
in.push(ifs);
boost::archive::binary_iarchive ia(in);
ia >> *this;

【问题讨论】:

  • 问题是什么?你已经完成了,看起来。能不把序列化存档挂到过滤流吗?

标签: boost mpi zlib


【解决方案1】:

根据 sehe 的建议,重试序列化为字符串流,压缩该字符串流并将其作为字符串广播。我出错的地方是将字符串流和解压缩器添加到流缓冲区的顺序。使用1中的compress1和decompress1函数,代码如下:

在根节点上

std::stringstream sstr(std::stringstream::out);
boost::archive::binary_oarchive archive(sstr);
archive << big_instance;
std::string str = sstr.str();
str = compress1(str);
broadcast(world, str, 0);

在接收节点上

boost::mpi::broadcast(world, str, 0); 
std::stringstream sstr(ecsim::string_decompress(str));
boost::archive::binary_iarchive iarchive(sstr);
iarchive >> big_instance;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2014-12-16
    • 2017-05-17
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多