2016-06-11 22 views
0

ファイルに保存する必要がある非常に大きな構造体(100k以上の構造体)の配列があります。その後、これらは一度に1つずつロードされ、処理されなければならない。現在の方法は、ちょうどsaveを使用してそれを保存することです。保存には8秒かかります。MATLABの大規模な構造体の保存/読み込みパフォーマンスを改善する

は、私はこれをスピードアップするためにいくつかの方法を試してみた:

  1. save-v6フラグを使用します。これは物事を加速させたが、それほど重要ではなかった。

  2. getByteStreamFromArray()およびをそれぞれ使用してシリアライズおよびデシリアライズします。これは効果がありませんでした。具体的には、シリアライズとデシリアライズは、単に保存して読み込むだけの時間がかかりました。

  3. 、それが処理されるだけ(むしろ全体の配列よりも)それぞれの構造をデシリアライズ、それをロードし、それを保存し、配列をシリアライズ(まだこれに取り組んで)

誰でもへの勧告を持っていますこのような状況でパフォーマンスを改善しますか?よくある問題のようです。

+1

これはオプションではないかもしれませんが、あなたは構造体にデータをどのように格納するかを考えることができます。たとえば、多くのフィールドを持つ構造体の配列は、フィールドの配列を持つ単一の構造体よりも効率が悪くなります。一般に、データをメモリ内の連続したブロックにグループ化するものは、高速にする必要があります。また、変数のサブセットをロード/更新するだけであれば、必要なものをすべてロードするのではなくロード/セーブするだけです。 – user20160

+0

@ user20160最後のオプションは私が探しているものです。配列全体を保存する必要があり、配列の一部を推奨する方法( 'matfile')はちょうど(' matfile'を呼び出すために)長い時間がかかります。そのため、私はそれをシリアル化し、次に必要な部分のみをデシリアライズします(uint8のベクトルとして配列全体を読み込むことはほとんど瞬間です) –

+0

これがあなたのケースのオプションである場合は、構造体の配列ロード/セーブ操作の前に単純な配列に変換して戻します。 – user1735003

答えて

1

私はあなたの結果は、私にとって非常に驚くべきことではないですのでgetByteStreamFromArray()とは、ボンネットの下にsave()load()で使用されていると信じています。構造体をクロールして本当に必要なものだけを保存する、手作業でシリアライズされた関数を使用すると、パフォーマンスが向上する可能性があります。セーブされたデータを圧縮することにより、追加のセーブが可能です。あなたはここにいくつかの実装のアイデアを読むことができます:http://undocumentedmatlab.com/blog/improving-save-performance

ノート#1 - Matlabのリリースに基づいYMMV、データ、およびプラットフォーム

ノート#2 - このことを認識していない読者のために、getByteStreamFromArray()との両方が文書化されていないですMatlab関数。 AFAIKの行動の唯一の[非公式な]説明は、ここに提供されています:http://undocumentedmatlab.com/blog/serializing-deserializing-matlab-data

関連する問題