提升mpi序列化压缩

时间:2014-04-22 22:21:14

标签: boost mpi zlib

我正在寻找一种在boost.MPI广播,分散,收集请求中压缩序列化数据的方法。要发送的类包含需要通过无线网络传输的大量数据(400MB)。虽然它发送,但需要> 20分钟。前进的方法是压缩数据,如增强压缩存档中所示(见下文)。你知道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;

1 个答案:

答案 0 :(得分:1)

根据sehe的建议,重新序列化为字符串流,压缩该字符串并将其作为字符串广播。我出错的地方是将stringstream和decompressor添加到流缓冲区的顺序。使用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;