2

NumPy を使用したとき、そのデータをネイティブ形式 *.npy で保存しました。それは非常に速く、このようないくつかの利点を私に与えました

  • C コードから *.npy を単純なバイナリ データとして読み取ることができました (つまり、*.npy は C 構造とバイナリ互換です)。

今、私は HDF5 (現時点では PyTables) を扱っています。チュートリアルで読んだように、彼らは NumPy シリアライザーを使用して NumPy データを保存しているので、単純な *.npy ファイルから C からこれらのデータを読み取ることができますか?

HDF5 の numpy は C 構造体ともバイナリ互換ですか?

更新日:

hdf5から読み取るmatlabクライアントがありますが、* .npyからバイナリデータを読み取る方が数倍高速であるため、C++からhdf5を読み取りたくないので、C++からhdf5を読み取る必要があります(バイナリ互換性)だから私はすでにデータを転送するための2つの方法を使用しています-* .npy(C++からバイトとして読み取り、Pythonからネイティブに)およびhdf5(Matlabからのアクセス)そして、可能であれば、唯一の方法であるhdf5を使用したいのですが、これを行うために私は持っていますC++構造でhdf5をバイナリ互換にする方法を見つけるには、助けてください.hdf5で圧縮をオフにする方法や、C++構造でhdf5をバイナリ互換にする方法があれば、それについてどこで読めるか教えてください...

4

3 に答える 3

9

C から hdf5 ファイルを読み取る適切な方法は、hdf5 API を使用することです。このチュートリアルを参照してください。原則として、hdf5 ファイルで圧縮などの高度なストレージ オプションを使用していないと仮定すると、.npy ファイルの場合と同様に、hdf5 ファイルから生データを直接読み取ることができます。ただし、これは本質的に hdf5 形式を使用することの要点全体に反しており、適切な hdf5 API を使用する代わりにこれを行う利点は考えられません。また、API には単純化された高レベル バージョンがあり、C からの読み取りが比較的容易になることにも注意してください。

于 2010-11-09T12:22:06.940 に答える
1

あなたの痛みが分かります。私は、HDF5 形式のファイルに格納された大量のデータを幅広く扱ってきました。役立つ情報をいくつか収集しました。

ファイルの作成 (およびデータの書き込み - API を使用している場合でも) を "制御" している場合は、HDF5 ライブラリをほぼ完全に回避できるはずです。

出力データセットがチャンク化されていない場合、それらは連続して書き込まれます。データ型定義でバイト順変換を指定していない限り (つまり、データをネイティブの float/double/integer 形式で書き込むように指定している場合)、次のように「バイナリ互換性」を実現できるはずです。それ。

私の問題を解決するために、ファイル仕様http://www.hdfgroup.org/HDF5/doc/H5.format.htmlを使用して HDF5 ファイル パーサーを作成しました。

かなり単純なパーサーを使用すると、任意のデータセットへのオフセット (およびサイズ) を識別できるはずです。その時点で、単純に fseek と fread を実行します (C では、つまり、C++ で使用できるより高いレベルのアプローチがある可能性があります)。

データセットがチャンクされている場合、チャンクを編成するために使用される b ツリーをトラバースするには、さらに解析が必要です。

注意すべき他の唯一の問題は、システムに依存する構造体のパディングを処理する (または排除する) ことです。

于 2010-11-10T00:57:51.477 に答える
0

HDF5 は、構造体のバイナリ互換性を処理します。構造体の構成要素 (dtype) を指定するだけで、レコード配列の保存/読み取りに問題はありません。これは、型システムが基本的に numpy と HDF5 の間で 1:1 であるためです。H5py を使用する場合、すべてのネイティブ タイプと大規模なバッチ読み取り/書き込み (許容範囲のデータセット全体) を使用すれば、IO は十分に高速であると確信しています。その後は、チャンキングとフィルター (シャッフル、圧縮など) に依存します。また、ファイル サイズを大幅に縮小することで速度が向上する場合があるため、常にベンチマークを確認することも重要です。タイプとフィルターの選択は、HDF5 ドキュメントの作成時に行われることに注意してください。

HDF5 を自分で解析しようとしている場合は、間違っています。C++/C で作業している場合は、C++ および C API を使用してください。HDF5 グループの Web サイトには、いわゆる「複合型」の例があります。

于 2015-05-03T01:56:46.640 に答える