11

サイズが約1Gの大きなデータ構造では、ネイティブマットファイル形式の書き込みと読み取りが非常に遅くなることがわかりました。さらに、これらのファイルの読み取りと書き込みができるはずの、MATLAB以外のソフトウェアもあります。そこで、MATLABデータ構造をシリアル化するために使用する別の形式を見つけたいと思います。理想的には、この形式は...

  1. 任意のMATLAB構造をファイルに表すことができます。
  2. マットファイルよりも高速なI/Oを備えています。
  3. Java、Python、C++などの他の言語用のI/Oライブラリがあります。
4

2 に答える 2

18

データ構造を単純化し、HDF5の変形である新しいv7.3 MATファイル形式を使用することが、実際には最良のアプローチである可能性があります。HDF5形式は開いており、他の言語用のI/Oライブラリがすでにあります。また、データ構造によっては、古いバイナリマットファイルよりも高速な場合があります。

  • 保存するデータ構造を単純化し、複雑なコンテナ構造よりもプリミティブの大きな配列を優先します。
  • データ構造がまだ複雑な場合は、圧縮をオフにしてみてください。
  • 「-v7.3」を使用してv7.3MATファイル形式を試してください
  • ネットワークファイルシステムを使用している場合は、高速ローカルドライブの一時ディレクトリに保存してロードし、ネットワークとの間でコピーすることを検討してください。

大規模なデータ構造の場合、MATファイルのI / O速度は、結果のMATファイル自体のサイズよりも、書き出すデータの内部構造によって決まる場合があります。(私の経験では、これは通常、低速のMATファイルの主な要因です。)「任意のMatlab構造」と言う場合、セル、構造体、またはオブジェクトを使用して複雑なデータ構造を作成している可能性があります。MATファイルI/Oには配列ごとのオーバーヘッドがあり、セル配列と構造体配列(コンテナタイプ)のメンバーはすべて個別の配列としてカウントされるため、MAT I/Oの速度が低下します。たとえば、cellstrに格納されている5,000文字列は、2次元char配列に格納されている同じ5,000文字列よりもはるかに低速です。また、オブジェクトにはさらに多くのオーバーヘッドがあります。テストとして、ランダムなuint8の1GBのプリミティブ配列のみを含む1GBのファイルを書き出してみてください。それにかかる時間を確認してください。そこから、データを単純化してmxarrayの総数を減らすことができるかどうかを確認します。これは、シリアル化のためにデータを再形成することを意味します。(これに関する私の経験は、ほとんどがv7形式です。新しいHDF5形式では、要素あたりのオーバーヘッドが少なくなる可能性があります。)

データファイルがネットワーク上にある場合は、高速ローカルドライブ上の一時ファイルに対して保存および読み込み操作を実行し、コピー操作を個別に使用してネットワーク間でデータファイルを移動することもできます。少なくともWindowsネットワークでは、これを行うことで最大2倍のスピードアップが見られました。おそらく最適化のために、フルファイルコピー操作はMAT I/Oコードが実行できないことを実行できます。

完全に任意のMatlabデータ構造をサポートし、他の言語に移植可能な代替ファイル形式を考え出すことは、おそらくかなりの努力になるでしょう。まず、既存のフォーマットの使用に関して小さな変更を加えてみます。

于 2012-09-26T06:29:54.650 に答える
3

マット形式はMatlabバージョンで変更されました。v7.3はHDF5形式を使用します。これには、圧縮やその他の機能が組み込まれており、読み取り/書き込みに時間がかかる場合があります。ただし、Matlabに、より高速な以前の形式を使用させることができます(ただし、より多くのスペースが必要になる場合があります)。

ここを参照してください:

http://www.mathworks.com/help/matlab/import_export/mat-file-versions.html

于 2012-09-26T01:16:12.893 に答える