增强二进制存档—减小大小 我试图减少C++中Boost档的内存大小。p>

增强二进制存档—减小大小 我试图减少C++中Boost档的内存大小。p>,c++,serialization,boost,archive,C++,Serialization,Boost,Archive,我发现的一个问题是Boost的二进制存档默认为任何int使用4字节,而不管其大小。出于这个原因,我发现一个空的boost二进制存档需要62个字节,而一个空文本存档需要40个字节(空文本存档的文本表示:22序列化::存档14 0 1 0 0 0) 有没有办法更改ints的默认行为 另外,除了使用make_数组作为向量外,还有其他方法优化二进制存档的大小吗 正如Alexey所说,在Boost中,您必须使用较小的成员变量。唯一做得更好的序列化是AFAIK、Google协议缓冲区和ASN.1 PER G

我发现的一个问题是Boost的二进制存档默认为任何int使用4字节,而不管其大小。出于这个原因,我发现一个空的boost二进制存档需要62个字节,而一个空文本存档需要40个字节(空文本存档的文本表示:
22序列化::存档14 0 1 0 0 0

有没有办法更改ints的默认行为


另外,除了使用make_数组作为向量外,还有其他方法优化二进制存档的大小吗

正如Alexey所说,在Boost中,您必须使用较小的成员变量。唯一做得更好的序列化是AFAIK、Google协议缓冲区和ASN.1 PER

GPB使用可变长度整数来使用与所传输的值相应的字节数

ASN.1%以不同的方式进行;在ASN.1方案中,您可以定义值的有效范围。因此,如果您声明一个int字段的有效范围在0到15之间,它将只使用4位。uPER更进一步;它不会将字段的位与字节边界对齐,从而节省更多位。uPER是3G、4G在无线链路上使用的,节省了大量带宽

据我所知,大多数其他工作都涉及使用ZIP或类似工具进行序列化后压缩。对大量数据罚款,否则为垃圾

  • <强> q.<强>我试图减少C++中Boost档的内存大小。p> 看

  • Q.我发现的一个问题是Boost的二进制存档默认为对任何int使用4字节,而不管其大小

    这是因为它是一个序列化库,而不是压缩库

  • Q.出于这个原因,我发现一个空的boost二进制存档需要62字节,而一个空文本存档需要40字节(一个空文本存档的文本表示:22序列化::存档14 0 1 0 0 0)

    使用存档标志:例如,来自:

    • 调整内容(boost::archive::no_codevt、boost::archive::no_头等)
  • Q.有没有办法更改ints的默认行为

    没有。尽管有
    BOOST\u可按位序列化(T)
    (参见示例和说明)

  • Q.除使用向量的
    make_array
    外,还有其他方法优化二进制存档的大小吗

    使用
    生成数组
    向量
    没有帮助:

    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/serialization/vector.hpp>
    #include <sstream>
    #include <iostream>
    
    static auto const flags = boost::archive::no_header | boost::archive::no_tracking;
    
    template <typename T>
    std::string direct(T const& v) {
        std::ostringstream oss;
        {
            boost::archive::binary_oarchive oa(oss, flags);
            oa << v;
        }
        return oss.str();
    }
    
    template <typename T>
    std::string as_pod_array(T const& v) {
        std::ostringstream oss;
        {
            boost::archive::binary_oarchive oa(oss, flags);
            oa << v.size() << boost::serialization::make_array(v.data(), v.size());
        }
        return oss.str();
    }
    
    int main() {
        std::vector<int> i(100);
        std::cout << "direct: "       << direct(i).size() << "\n";
        std::cout << "as_pod_array: " << as_pod_array(i).size() << "\n";
    }
    
    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/serialization/vector.hpp>
    #include <sstream>
    #include <iostream>
    #include <boost/iostreams/filter/bzip2.hpp>
    #include <boost/iostreams/filtering_stream.hpp>
    #include <boost/iostreams/device/back_inserter.hpp>
    #include <boost/iostreams/copy.hpp>
    
    static auto const flags = boost::archive::no_header | boost::archive::no_tracking;
    
    template <typename T>
    size_t archive_size(T const& v)
    {
        std::stringstream ss;
        {
            boost::archive::binary_oarchive oa(ss, flags);
            oa << v;
        }
    
        std::vector<char> compressed;
        {
            boost::iostreams::filtering_ostream fos;
            fos.push(boost::iostreams::bzip2_compressor());
            fos.push(boost::iostreams::back_inserter(compressed));
    
            boost::iostreams::copy(ss, fos);
        }
    
        return compressed.size();
    }
    
    int main() {
        std::vector<int> i(100);
        std::cout << "bzip2: " << archive_size(i) << "\n";
    }
    
  • 压缩 最直接的优化方法是压缩结果流(另请参见添加的基准测试)

    除此之外,您必须覆盖默认序列化并应用您自己的压缩(可以是简单的运行长度编码、哈夫曼编码或更特定于域的编码)

    演示

    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/serialization/vector.hpp>
    #include <sstream>
    #include <iostream>
    
    static auto const flags = boost::archive::no_header | boost::archive::no_tracking;
    
    template <typename T>
    std::string direct(T const& v) {
        std::ostringstream oss;
        {
            boost::archive::binary_oarchive oa(oss, flags);
            oa << v;
        }
        return oss.str();
    }
    
    template <typename T>
    std::string as_pod_array(T const& v) {
        std::ostringstream oss;
        {
            boost::archive::binary_oarchive oa(oss, flags);
            oa << v.size() << boost::serialization::make_array(v.data(), v.size());
        }
        return oss.str();
    }
    
    int main() {
        std::vector<int> i(100);
        std::cout << "direct: "       << direct(i).size() << "\n";
        std::cout << "as_pod_array: " << as_pod_array(i).size() << "\n";
    }
    
    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/serialization/vector.hpp>
    #include <sstream>
    #include <iostream>
    #include <boost/iostreams/filter/bzip2.hpp>
    #include <boost/iostreams/filtering_stream.hpp>
    #include <boost/iostreams/device/back_inserter.hpp>
    #include <boost/iostreams/copy.hpp>
    
    static auto const flags = boost::archive::no_header | boost::archive::no_tracking;
    
    template <typename T>
    size_t archive_size(T const& v)
    {
        std::stringstream ss;
        {
            boost::archive::binary_oarchive oa(ss, flags);
            oa << v;
        }
    
        std::vector<char> compressed;
        {
            boost::iostreams::filtering_ostream fos;
            fos.push(boost::iostreams::bzip2_compressor());
            fos.push(boost::iostreams::back_inserter(compressed));
    
            boost::iostreams::copy(ss, fos);
        }
    
        return compressed.size();
    }
    
    int main() {
        std::vector<int> i(100);
        std::cout << "bzip2: " << archive_size(i) << "\n";
    }
    
    这是约11%的压缩率(如果删除存档标志,则为约19%)