3

何千ものメンバーを含むことができるを含むオブジェクトをシリアル化する必要がありますstd::vector<unsigned char>。そのベクトルサイズでは、シリアル化は適切にスケーリングされません。

ドキュメントによると、Boostは最適化のためにベクトルをラップするラッパークラス配列を提供しますが、同じxml出力を生成します。ブーストコードに飛び込んでuse_array_optimization、最適化を制御しているように見えるが、デフォルトで何らかの理由で非アクティブ化されているという名前のクラスを見つけました。また、シリアル化機能をオーバーライドしようとしましたが、結果はありませんでした。

ブースト時のドキュメントが不明確なので、その最適化をアクティブにする方法を知りたいです。

4

3 に答える 3

0

配列最適化の背後にある考え方は、表現をそのままアーカイブに「ダンプ」するだけでアーカイブできる型の配列の場合、配列全体を一度に「ダンプ」する方が、要素を次々に「ダンプ」するよりも高速であるということです。 。

あなたの質問から、xmlアーカイブを使用していることがわかりました。その場合、要素のシリアル化はとにかく変換​​を意味するため、配列の最適化は適用されません。

于 2009-11-04T17:16:36.160 に答える
0

最後に、BOOST_SERIALIZATION_SPLIT_MEMBER()マクロを使用して、ロードと保存のために2つの関数をコーディングしました。保存機能は次のようになります。

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関数は、単にデータをvectorで取得し、それをstd::stringにフォーマットします。ロード関数は、エンコードを逆にする関数を使用します。

于 2009-11-06T07:28:27.567 に答える
0

vectorBoost SerializationtoXMLを使用してをシリアル化する方法はいくつかあります。私がコメントで読んだことから、あなたは以下のケース2を探しています。

std::vectorを含めた後、ライブラリによるシリアル化の方法を変更することはできないと思いますがboost/serialization/vector.hpp、そこにあるコードを独自のものやケース2に近いものに置き換えることができます。

0.ライブラリのデフォルト、最適化されていない

1つ目は、ライブラリによって指定されたデフォルトを使用することです。これは、私が知る限り、何も最適化しないものです。

#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>

これにより、XMLは技術的に移植性がなくなると思います。

于 2021-11-28T11:14:10.673 に答える