0

ブーストシリアライゼーションで多重継承を使用しています。する代わりに

boost::serialization::base_object< Connection<T> >(*this)
boost::serialization::base_object< Collection<C> >(*this)

私がやっている

template<typename ArchiveT>
void save(ArchiveT& arc, const unsigned version) const{
  //both Connection<T> and Collection<C> are Base Classes
  Connection<T>::save(arc, version);
  Collection<C>::save(arc, version);
}

そしてその働き。それで、それらのうちの2つは同じものですか?またはこれを行うことに害はありますか?このコードを変更する必要がありますか?

{これはずっと前にコード化されたものです。だから、なぜそのようにコーディングしたのか忘れました。base_objectその時は気がつかなかったかもしれません}

膨大なデータ セット (~1.6 GB) をシリアライズしています。シリアライズすると、シリアライズ プロセスが大量のメモリを消費し、3GB の壁に達していることがわかります。シリアル化コードにコメントを付けてみましたが、50MB 未満のメモリが必要です。では、シリアライゼーションがその大きなメモリを必要とするのはなぜでしょうか?

4

1 に答える 1

0

コードを変更し、 を介して基本クラスをシリアル化する必要がありますbase_object<>()

ドキュメントから:

[...] これは、基本クラスのシリアル化関数を呼び出すことと同じではないことに注意してください。これは機能しているように見えますが、オブジェクトの追跡、ベース派生関係の登録、およびシリアル化システムが設計どおりに機能するために必要なその他の簿記に使用される特定のコードを回避します。このため、すべてのシリアル化メンバー関数はプライベートにする必要があります。

余分なメモリ消費は、オブジェクト トラッキングが原因である可能性があります。追跡するオブジェクトが大量にある場合、シリアル化中にメモリ消費量が大幅に増加する可能性があります。

特別な考慮事項から:

ポインター値が重複しないことが先験的にわかっている場合、オブジェクト追跡クラスのシリアライゼーション トレイトを適切に設定することで、オブジェクト追跡に関連するオーバーヘッドを排除できます。

オブジェクト トラッキングが必要ない場合は、次の方法で無効にすることができます。

BOOST_CLASS_TRACKING(the_class, boost::serialization::track_never)
于 2012-11-22T11:36:19.203 に答える