2017-06-06 2 views
0

std::vector<MyClass>をMPI経由でさまざまなサイズで通信しようとしています。 MyClassには、初期化されていないか、またはサイズが異なる可能性のあるベクトルであるメンバーが含まれています。そのために、私はserialize()deserialize()のようなものを書いて、そのようなstd::vector<MyClass>std::stringに読み書きし、それをMPI経由で通信しています。オブジェクトのベクトルをstd :: stringにシリアル化してMPIで使用する

私の実装は原則として動作しますが、(必ずしもそうではありません)MPIプロセスがシリアル化に関連すると思われる位置でクラッシュすることがあります。送信されるペイロードは、MBのhundretsと同じくらい大きくなる可能性があります。私は容器としてstd::stringを使用することは良い選択ではないと思う。私はここに実行されているかもしれない巨大なバイナリデータを持つchar[]のコンテナとしてstd::stringを使用するいくつかの制限がありますか?バイナリデータのためstd::stringを使用して、

(私はその直列化ルーチンと一緒にboost::mpiを使用しないことに、注意していない、どちらも私は私のプロジェクトに、このようなcerealとして巨大なライブラリにプルしたいです)

+0

私はあなたが答えから欲しいものは本当にわかりません。これはクラッシュについてですか?次に、現在のデバッグ作業の[mcve]と説明が必要です。または、これは正しくシリアル化を行う方法ですか?または、MPIで複合C++オブジェクトを送信する方法です(シリアル化はその1つの答えです)。これが本当に "* MPIを介してシリアル化されたデータの送信を実装する"のであれば、少なくともあなたのMPIコードを見る必要があります。これらの質問の多くは、意見が重い(「*良い方法*」)特定の目標や基準に焦点を当ててください。 – Zulan

+0

こんにちはズーラン、申し訳ありませんが、質問はあまり正確ではありません。私はそれを言い換えようとします。私は多くのMPI要求に問題がなくても_sometimes_クラッシュする大きな数値シミュレーションで上記のルーチンを使用しています。スタックトレースはそれほど役に立ちません( 'bad_alloc'を含んでいますので、メモリのことを推測します)、私は簡単な例を簡単に作成できません。私は問題のために 'std :: string'のいくつかの制限を疑ったので、私の質問です。 – janoliver

+0

serializeメソッドを 'try {...} catch(std :: bad_alloc&){...}'ブロックにカプセル化しようとすることができます。さらに、メモリプロファイラを使用してメモリリークを分析することもできます。 –

答えて

1

一般一部の人はstd::vector<char> - またはstd::vector<std::byte>をC++で好むかもしれませんが(see also、C++の11文字列は連続したデータを保証します)。コードには2つの重要な効率の問題があります。

  1. データ全体のコピーは3つあります。元のオブジェクト、シリアライズされたstringおよび中間[io]stringstream
  2. ostringstreamにデータをあらかじめ割り当てる(予約する)ことはできません。過剰割り当てや頻繁な再割り当てが発生する可能性があります。

したがって、かなりの量のメモリを浪費します。これは、bad_allocに寄与する可能性があります。それは完全にうまくいくかもしれないし、ちょうどどこかでメモリリークがあると言いました。 bad_allocの原因とアプリケーションのパフォーマンス分析を知らなくても、これが実際的な問題であるかどうかは分かりません。

関連する問題