17

決定を下すには助けが必要です。アプリケーションでデータを転送する必要があり、これら 3 つのテクノロジのいずれかを選択する必要があります。すべてのテクノロジー (チュートリアル、ドキュメント) について少し読みましたが、まだ決定できません...

それらはどのように比較されますか?

メタデータのサポート (追加情報/ファイルなしでファイルを受信して​​読み取る機能)、高速な読み取り/書き込み操作、動的データを保存する機能 (Python オブジェクトなど) が必要です。

私がすでに知っていること:

  • NumPyは非常に高速ですが、動的データ (Python オブジェクトなど) を格納できません。(メタデータはどうですか?)
  • HDF5は非常に高速で、カスタム属性をサポートし、使いやすいですが、Python オブジェクトを保存できません。また、HDF5はNumPyデータをネイティブにシリアル化するため、私見、NumPyはHDF5よりも利点がありません
  • Google Protocol Buffersも自己記述型をサポートしており、かなり高速です (ただし、現時点では Python のサポートは貧弱で、遅くてバグがあります)。動的データを保存できます。欠点 - 自己記述型は Python からは機能せず、1 MB 以上のメッセージはシリアライズ/デシリアライズがあまり高速ではありません (「遅い」と読みます)。

PS: 転送する必要があるデータは、NumPy/SciPy の「作業の結果」(配列、複雑な構造体の配列など) です。

UPD: クロス言語アクセスが必要 (C/C++/Python)

4

2 に答える 2

13

あなたの質問には少し矛盾があるようです.Pythonオブジェクトを保存できるようにしたいのですが、C/C++アクセスも必要です。どちらを選択するにしても、派手な Python データ構造を配列などのより静的な構造に変換する必要があると思います。

クロス言語アクセスが必要な場合は、HDF5 を使用することをお勧めします。これは、言語、オペレーティング システム、システム アーキテクチャに依存しないように特別に設計されたファイル形式であるためです (たとえば、ロード時にビッグ エンディアンとリトル エンディアンを自動的に変換できます)。 ) であり、特に科学/数値計算を行うユーザーを対象としています。私は Google Protocol Buffers についてあまり知らないので、それについてあまりコメントすることはできません。

HDF5 を使用する場合は、 pytablesの代わりに h5pyを使用することもお勧めします。これは、pytables が大量の追加の pythonic メタデータを含む HDF5 ファイルを作成するため、C/C++ でのデータの読み取りが少し面倒になるのに対し、h5py はこれらの余分なものを作成しないためです。ここで比較を見つけることができます。また、この問題に関する彼らの見解について pytables FAQ へのリンクも提供されているため、ニーズに最も適したものを決定できます。

HDF5 に非常によく似た別の形式はNetCDFです。これには Python バインディングもありますが、私はこの形式を使用した経験がないため、この形式が存在し、科学計算でも広く使用されていることを指摘する以外にコメントすることはできません。

于 2010-11-08T22:06:42.057 に答える
4

HDF5についてはわかりませんが、PythonオブジェクトをNumPy配列に格納できます。配列での経営幹部レベルの操作の実行を禁止すると、重要な機能がすべて失われます。

In [17]: x = np.zeros(10, dtype=np.object)
In [18]: x[3] = {'pants', 10}
In [19]: x
Out[19]: array([0, 0, 0, set([10, 'pants']), 0, 0, 0, 0, 0, 0], dtype=object)
于 2010-11-08T17:15:01.977 に答える