問題タブ [hdf5]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - 行ベクトルを MATLAB の HDF に保存するにはどうすればよいですか?
何らかの理由で、hdf5write
MATLAB のメソッドは、行ベクトルを再度読み取ると、行ベクトルを列ベクトルに自動的に変換します。
ただし、3 次元の行ベクトルの場合は、問題なく返されます。
hdf5write
行ベクトルに対して正しいことを行うにはどうすればよいですか? 10 x 1 ではなく、1 x 10 として戻ってくるはずです。
編集ではなく、後で実際にデータを読み取るために c ベースの mex を使用しているため、問題は少し複雑ですhdf5read
。さらに、問題は実際には にhdf5write
あり、これは hdf5 ファイル自体に表示されます。
つまり、データは 1 次元配列として hdf5 ファイルに保存されます。比較のために、実際の 2 次元行列 (どのように見えるかを示すため)、1 次元列ベクトル、3 次元に沿った 1 次元ベクトルで同じことを試してみますV71Dimensions
。は と の両方のヘルプにhdf5read
ありhdf5write
ます:
したがって、問題はにあるようですhdf5write
。フラグは役に立ちません。'V71Dimensions'
結果の hdf5 ファイルは、データセット {10,1} ではなくデータセット {10} のままです。
python - Python でビッグデータの分析作業を行うために h5py を使用した経験はありますか?
私は多くの統計作業を行っており、Python をメイン言語として使用しています。私が扱っているデータ セットの中には 20 GB のメモリを必要とするものもあるため、numpy、scipy、および PyIMSL でインメモリ関数を使用してそれらを操作することはほとんど不可能です。統計分析言語 SAS には、厳密なインメモリ処理とは対照的に、ハードディスクからのデータを操作できるという大きな利点があります。しかし、(さまざまな理由で) SAS で大量のコードを記述する必要がないようにしたいため、Python でどのようなオプションがあるかを判断しようとしています (ハードウェアとメモリを追加購入する以外に)。
map-reduce のようなアプローチは、完全なデータ セットを操作する必要があるため (分位数の計算やロジスティック回帰モデルのフィッティングなど) 、私の作業の多くには役立たないことを明確にしておく必要があります。
最近、 h5pyをいじり始めましたが、numpy/scipy/matplotlib などを活用しながら、Python が SAS のように動作し、(hdf5 ファイルを介して) ディスクからのデータを操作できるようにするための最良のオプションだと思います。同様の設定で Python と h5py を使用した経験があるかどうか、また彼らが発見したことを知りたいです。これまでSASが支配していた「ビッグデータ」設定でPythonを使用できた人はいますか?
編集:ハードウェア/メモリを追加購入することは確かに役立ちますが、IT の観点からは、Python (または R、または MATLAB など) がデータをメモリに保持する必要がある場合に、巨大なデータ セットを分析する必要がある組織に Python を販売することは困難です。 . ディスクベースの分析は遅くなる可能性がありますが、巨大なデータ セットを自信を持って処理できるため、SAS は引き続き強力なセールス ポイントを持っています。ですから、Stackoverflow の専門家が、Python を主要なビッグデータ分析言語として使用することに関して認識されているリスクを軽減する方法を理解するのに役立つことを願っています。
r - hdf5save に保存すると、読み取り不能なファイルが作成されます
Rを使用して配列をHDF5ファイルとして保存しようとしていますが、うまくいきません。
私が実行した問題を試して診断するためにexample(hdf5save)
. これで、簡単に読める HDF5 ファイルが正常に作成されましたh5dump
。
その後、R コードを手動で実行したところ、機能しないことがわかりました。私が実行したコードは、サンプル スクリプトで実行したものとまったく同じでした (上書きを避けるためにファイル名を変更したことを除いて)。コードは次のとおりです。
からのエラーメッセージは次のh5dump
とおりです。
誰にもアイデアはありますか?私は完全に途方に暮れています。
ありがとう
file - MATLAB: "-v7.3" (HDF5) .mat ファイルへのいくつかの変数の保存は、"-append" フラグを使用すると高速になるようです。どうして?
注: この質問は、2011 年に古い MATLAB バージョン (R2009a) で観察された問題を扱っています。以下の 2016 年 7 月からの更新によると、MATLAB の問題/バグはもはや存在しないようです (R2016a でテスト済み。質問の最後までスクロールして更新を確認してください)。
私は MATLAB R2009b を使用しており、.zip ファイルのより大きなセットの内容を v7.3 mat ファイル (基礎となる HDF5 データモデルを使用) に変換する、より大きなスクリプトを作成する必要があります。読み取りOKです。問題は保存にあります。そして、実際には問題はありません。私のファイルは、 saveコマンドを使用してうまく保存されます。
私の質問はもっと意味があります: MATLAB で次の驚くべき (私にとって) 動作が見られるのはなぜですか?
一般的に私の問題を見てみましょう。この現在のテスト シナリオでは、1 つの出力 (-v7.3 mat ファイル) を生成します。この .mat ファイルには、個別の変数として40 個のブロックが含まれます。各変数には、1 から 40 までの「block_NNN」という名前が付けられ、フィールドframesおよびblockNoを持つ構造体が含まれます。フィールドフレームには、uint8 画像データの 480x240x65 シーケンスが含まれます (ここでは、 randi を使用して生成されたランダム データのみ)。フィールドblockNoにはブロック番号が含まれます。
注:実際のスクリプト (まだ完成していません) では、上記を合計 370 回実行し、合計 108 GB の生データを変換します。ということで、以下が気になります。
とにかく、最初にいくつかの一般変数を定義します。
次に、実際の生データと同じ形状とサイズを持つダミー コードを生成します。
これで、すべてのランダム テスト データが struct stu_data2diskに含まれるようになりました。ここで、2 つの可能な方法のいずれかを使用してデータを保存したいと思います。
最初に簡単なものを試してみましょう:
ファイルは問題なく書き込まれます (286MB)。出力は次のとおりです。
OK - それから、40 ブロックにわたって保存手順を実行したいことを思い出しました。したがって、上記の代わりに、ブロックをループして順番に追加します。
また、ファイルはうまく保存されます (286MB)。出力は次のとおりです。
興味深いことに、append-method ははるかに高速ですか? 私の質問はなぜですか?
からの出力dir converted*.mat
:
ファイルのサイズが同じではありません。そして、Windows 7 でfcを使用したテストでは、多くのバイナリの違いが明らかになりました。おそらく、データが少しシフトされたので、何もわかりません。
誰かがここで何が起こっているのか知っていますか? 追加されたファイルは、おそらくより最適化されたデータ構造を使用していますか? それとも、Windows がファイルをキャッシュして、ファイルへのアクセスを大幅に高速化したのでしょうか。
2つのファイルからも試し読みをしてみました。ここに数値を提示しなければ、追加されたバージョンは少し高速でした (ただし、長期的には何かを意味する可能性があります)。
[編集] : フォーマット フラグを使用せずに試してみたところ (私のシステムではデフォルトで -v7 になっています)、あまり違いはありません:
[編集] : 上記の間違いを修正しました。以前、統計は -v6 のものであると述べましたが、私は間違っていました。フォーマット フラグを削除したばかりで、デフォルトが -v6 であると想定していましたが、実際には -v7 です。
Andrew の優れたフレームワークを使用して、システム上のすべての形式の新しいテスト統計を作成しました (すべての形式は、ファイルから読み取られた同じランダム テスト データ用です)。
そして、ファイルのサイズ:
したがって、書き込みには -v6 が最速のようです。また、ファイルサイズに大きな違いはありません。私の知る限り、HDF5 にはいくつかの基本的な inflate メソッドが組み込まれています。
うーん、おそらく基礎となる HDF5 書き込み関数の最適化ですか?
現在、基礎となるいくつかの基本的な HDF5 書き込み関数は、データセットを HDF5 ファイルに追加するために最適化されていると思います (これは、新しい変数を -7.3 ファイルに追加するときに発生します)。HDF5がまさにこの方法で最適化されるべきであるとどこかで読んだと思います...確かではありませんが。
その他の注意事項:
以下のアンドリューの回答に見られるように、動作は非常に体系的です。また、これらを関数のローカル スコープで実行するか、m-script の「グローバル」で実行するかについても非常に重要なようです。私の最初の結果は、ファイルが現在のディレクトリに書き込まれた m スクリプトからのものでした。m スクリプトで -7.3 の 1 秒の書き込みしか再現できません。関数呼び出しにより、明らかにオーバーヘッドが追加されます。
2016 年 7 月の更新:
私はこれを再び見つけ、現時点で利用可能な最新の MATLAB でテストできると考えました。Windows 7 x64 上の MATLAB R2016a では、問題が修正されたようです。
これは、以下の受け入れられた回答の Andrew Janke のreproMatfileAppendSpeedup
関数でテストされました (形式 7.3 で 5 パス)。現在-append
は、1 回の保存が同じように、または遅くなりました。おそらく、R2009a で使用されていた HDF5 ドライバーの初期のビルドに問題があったのでしょう。
matlab - MATLAB: .mat バージョン間の違い
公式ドキュメントには次のように記載されています。
. しかし、上記の表に記載されている以外にも重要な違いがあることに気付きました。
たとえば、 MATLAB で176 MBのメモリを占有する約 6,000 要素の cell 配列を保存すると、 -v7または-v7.3のどちらを使用するかに応じて、次の結果が得られます。
- -v7の場合: ファイル サイズ = 15 MB、保存と読み込みが高速です。
- -v7.3の場合: ファイル サイズ = 400 MBで、保存と読み込みが非常に 遅い(おそらくファイル サイズが大きいため)。
他の誰かがこれらの違いに気づいたことがありますか?
更新 1 : 返信が指摘するように、-v7.3は HDF5 に依存しており、Mathworks によれば、「この形式にはかなりのストレージ オーバーヘッドがあります」 。代わりに HDF5 の実装と処理。
更新 2 : @Andrew Janke は、この非常に役立つ PDF (Web では HTML 形式で利用できないようです) を教えてくれます。詳細については、@Amro が提供する回答のコメントを参照してください。
これはすべて、次の質問につながります。両方の長所を組み合わせた代替手段はありますか(たとえば、 -v7 の効率と-v7.3の非常に大きなファイルを処理する機能) ?
python - PyTables for Python 2.7 を再インストールできません
2.7 に加えて Python 2.7 をインストールしています。2.7 用に PyTables を再度インストールすると、このエラーが発生します -
- numpy 1.5.1 パッケージがインストールされていることがわかりました。.. エラー:: ローカルの HDF5 インストールが見つかりませんでした。
HDF5_DIR
環境変数を設定するか、--hdf5
コマンドライン オプションを使用して、ローカルの HDF5 ヘッダーとライブラリを見つけることができる場所を明示的に指定する必要がある場合があります。
HDFのインストールについては明確ではありません。再度ダウンロードして、/usr/local/hdf5 ディレクトリにコピーしました。PyTableのインストールで提案されているように、環境変数を設定しようとしました。他の誰かが助けることができるこの問題を抱えていましたか?
python - PyTablesのバッチ取得と更新
PyTablesを使用して作成されたHDF5ファイルとして毎日の株式データがあります。行のグループを取得し、それを配列として処理してから、PyTablesを使用してディスクに書き戻します(行を更新します)。私はこれをきれいに行う方法を見つけることができませんでした。これを達成するための最良の方法を教えてください。
私のデータ:
各シンボルに対応する行を配列として読み取り、処理を実行して、フィールドvar1とvar2を更新したいと思います。私はすべての記号を事前に知っているので、それらをループすることができます。私はこのようなことを試みました:
rows_arrayを別の関数に渡して、var1とvar2の値を計算し、レコードごとに更新したいと思います。var1、var2は移動平均に似ているため、イテレータ内でそれらを計算することはできません。したがって、行のセット全体を配列にする必要があることに注意してください。
rows_arrayを使用して必要なものを計算した後、それをデータに書き戻す方法、つまり、新しい計算値で行を更新する方法がわかりません。テーブル全体を更新するとき、私はこれを使用します:
ただし、テーブルの一部だけを更新したい場合は、それを行うのが最善の方法ではありません。'where'条件を再実行して、計算に基づいて各行を更新できると思いますが、テーブルを再スキャンするのは時間の無駄のようです。
あなたの提案は大歓迎です...
ありがとう、-e
macos - OS X ランタイム リンカーが間違ったバージョンの lib を検出する
Python プログラムから呼び出される C++ 共有ライブラリがあります。C++ lib は、OS X で自作を使用してインストールした HDF5 でコンパイルされているため、/usr/local/lib
. 問題は、古いバージョンの libhdf5 を含む PyTables もインストールされていることです。/Library/Frameworks/EPD64.framework/Versions/Current/...
ライブラリを問題なくコンパイルおよびリンクでき、otool -L
実際に/usr/local/lib/libhdf5.dylib
. しかし、Python から実行しようとすると、バージョンの不一致エラーが発生します。どういうわけか、実行時リンカーが代わりに古い hdf5 ライブラリをロードしています。
1 つの回避策は、代わりに hdf5 を静的ライブラリとしてビルドすることですが、より適切な解決策を見つけたいと思います。ランタイム リンカーが新しいライブラリを使用するように説得するにはどうすればよいですか? 私はすでに DYLD_LIBRARY_PATH を設定しようとしましたが、それは他のすべてを壊しました (Python と MacVim は起動しません)。
python - 正規表現を使用してPython文字列の16進値を削除するにはどうすればよいですか?
matlabにセル配列があります
matlabのhdf5write関数を使用して配列をhdf5形式で保存するこれらのスクリプトを使用します。
次に、pytablesを使用してhdf5ファイルをpythonに読み込みます。セル配列は、文字列の多数の配列として提供されます。リストに変換すると、これが出力になります。
これらの16進値はどこかから文字列にポップインするので、削除したいと思います。それらはリストの最初の3つの項目に常に表示されるとは限らないので、それらに対処したり、そもそもなぜそこにあるのかを知るための良い方法が必要です。
正規表現を使用して16進値を削除しようとしましたが、うまくいきませんでした。
これに対処する方法について何か提案はありますか?
c++ - C++でHDF5compundデータ型を分割する方法
複合型(int、double、double)のHDF5ファイルがあります。現在、ドキュメントの例に従って、結果を構造体の配列に格納することにより、単一の操作でそれを読んでいます。
ただし、代わりに3つの部分をそれぞれ異なる配列に保存したいので、3つのポインター(int *、double *、double *)を提供し、データをコピーせずに3つの配列でデータを直接読み取ります。
誰かがそれを行う方法についての提案がありますか?