簡體   English   中英

如何在boost序列化中使用數組優化

[英]How to use array optimization in boost serialization

我必須序列化一個包含 std::vector 的對象,該對象可以包含數千個成員,該向量大小序列化不能很好地擴展。

根據文檔,Boost 提供了一個包裝類數組,用於包裝向量以進行優化,但它生成相同的 xml 輸出。 深入研究 boost 代碼,我發現了一個名為 use_array_optimization 的類,它似乎控制優化,但默認情況下以某種方式停用。 我還嘗試覆蓋序列化函數但沒有結果。

我想知道如何激活優化,因為 boost 的文檔不清楚。

數組優化背后的想法是,對於可以通過簡單地按原樣“轉儲”其表示形式到存檔的方式來存儲類型的數組,一次“轉儲”整個數組要比“先轉儲”另一個元素快。 。

我從您的問題中了解到您正在使用xml歸檔文件。 數組優化不適用於那種情況,因為元素的序列化仍然意味着要進行轉換。

最后,我使用了BOOST_SERIALIZATION_SPLIT_MEMBER()宏並對兩個用於加載和保存的函數進行了編碼。 保存功能如下所示:

template<class Archive>
void save(Archive & ar, const unsigned int version) const
{
    using boost::serialization::make_nvp;
std::string     sdata;
Vector2String(vData, sdata);
ar & boost::serialization::make_nvp("vData", sdata);
}

Vector2String函數只是將數據轉換為矢量並將其格式化為std :: string。 加載功能使用了一種反轉編碼的功能。

您有多種方法可以使用 Boost Serialization to XML 將vector序列化。 根據我在評論中讀到的內容,您正在尋找下面的案例 2。

我認為在包含boost/serialization/vector.hpp之后你不能改變std::vector被庫boost/serialization/vector.hpp ,但是你可以用你自己的和接近案例 2 的東西替換那里的代碼。

0. 庫默認,未優化

第一個是使用庫給出的默認值,據我所知不會優化任何東西:

#include <boost/serialization/vector.hpp>
...
    std::vector<double> vec(4);
    std::iota(begin(vec), end(vec), 0);

    std::ofstream ofs{"default.xml", boost::archive::no_header};
    boost::archive::xml_oarchive xoa{ofs};
    xoa<< BOOST_NVP(vec);

輸出:

<vec>
        <count>4</count>
        <item_version>0</item_version>
        <item>0.00000000000000000e+00</item>
        <item>1.00000000000000000e+00</item>
        <item>2.00000000000000000e+00</item>
        <item>3.00000000000000000e+00</item>
</vec>

1.手動,使用數據是連續的

#include <boost/serialization/array_wrapper.hpp>  // for make_array
...
        std::ofstream ofs{"array.xml"};
        boost::archive::xml_oarchive xoa{ofs, boost::archive::no_header};
        auto const size = vec.size();
        xoa<< BOOST_NVP(size) << boost::serialization::make_nvp("data", boost::serialization::make_array(vec.data(), vec.size()));

輸出:

<size>4</size>
<data>
        <item>0.00000000000000000e+00</item>
        <item>1.00000000000000000e+00</item>
        <item>2.00000000000000000e+00</item>
        <item>3.00000000000000000e+00</item>
</data>

2. 手動,使用二進制和連續的數據

#include <boost/serialization/binary_object.hpp>
...
        std::ofstream ofs{"binary.xml"};
        boost::archive::xml_oarchive xoa{ofs, boost::archive::no_header};
        auto const size = vec.size();
        xoa<< BOOST_NVP(size) << boost::serialization::make_nvp("binary_data", boost::serialization::make_binary_object(vec.data(), vec.size()*sizeof(double)));
<size>4</size>
<binary_data>
AAAAAAAAAAAAAAAAAADwPwAAAAAAAABAAAAAAAAACEA=
</binary_data>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM