問題タブ [h5py]

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.

0 投票する
1 に答える
2314 参照

python - h5pyでHDF5ファイルを読み取るときにPythonスライスオブジェクトを使用しますか?

モジュールを使用して HDF5 ファイルからデータにアクセスするために Python スライス オブジェクトを使用しようとしていh5pyます。この例をまとめて、numpy配列では機能するが、 では機能しないことを示しh5pyます。

これにより、次の出力が得られます。

これが不可能かどうかは誰にもわかりませんh5pyか?そうでない場合、私の例h5pyのようにスライスを明示的に入力する代わりに、オブジェクトまたは変数を使用してスライスする別の方法はありf['data'][0:3,2:5]ますか?

0 投票する
1 に答える
1039 参照

python-3.x - h5py、散発的な書き込みエラー

大きな (500K x 500K) マトリックスに格納するいくつかの浮動小数点数があります。(いくつかの特定の条件に従って) 可変サイズの配列を使用して、それらをチャンクに格納しています。

配列を生成して共有キューに入れる並列化されたコード (Python3.3 および h5py) と、キューからポップして HDF5 マトリックスに 1 つずつ書き込む 1 つの専用プロセスがあります。約 90% の確率で期待どおりに動作します。

ときどき、特定の配列で書き込みエラーが発生しました。複数回実行すると、障害のあるアレイが常に変化します。

コードは次のとおりです。

エラーは次のとおりです。

書き込みタスクの間に 2 秒の一時停止 (time.sleep(2)) を挿入すると、問題は解決したように見えます (ただし、250.000 回以上書き込む必要があるため、書き込みごとに 2 秒を無駄にすることはできません)。書き込み例外をキャプチャして障害のある配列をキューに入れると、スクリプトは停止しません (おそらく)。

CentOS (2.6.32-279.11.1.el6.x86_64) を使用しています。洞察はありますか?

どうもありがとう。

0 投票する
5 に答える
1780 参照

numpy - Python パーティクル シミュレーター: コア外処理

問題の説明

Python/numpy でモンテカルロ粒子シミュレーター (ブラウン運動と光子放出) を作成中。シミュレーション出力 (>>10GB) をファイルに保存し、2 番目のステップでデータを処理する必要があります。Windows と Linux の両方との互換性は重要です。

粒子の数 ( n_particles) は 10 ~ 100 です。時間ステップ数 ( time_size) は ~10^9 です。

シミュレーションには 3 つのステップがあります (以下のコードはオールイン RAM バージョン用です)。

  1. rate 配列をシミュレート (および保存) しemissionます (ほぼ 0 の要素を多数含む):

    • 形状 ( n_particlesx time_size)、float32、サイズ80GB
  2. 配列を計算countsします (以前に計算されたレートを持つポアソン過程からのランダム値):

    • 形状 ( n_particlesx time_size)、uint8、サイズ20GB

      /li>
  3. カウントのタイムスタンプ (またはインデックス) を見つけます。カウントはほとんどの場合 0 であるため、タイムスタンプ配列は RAM に収まります。

    /li>

ステップ 1 を 1 回実行してから、ステップ 2 ~ 3 を何度も (~100 回) 繰り返します。将来的には、計算する前に前処理emission(適用cumsumまたは他の関数)が必要になるかもしれませんcounts

質問

私は動作中のメモリ内実装を持っており、(はるかに) 長いシミュレーションに拡張できるコア外バージョンを実装するための最良のアプローチは何かを理解しようとしています。

存在してほしいもの

配列をファイルに保存する必要があり、シミュレーションに 1 つのファイルを使用したいと考えています。また、シミュレーション パラメーター (スカラー) のディクショナリを格納および呼び出す "簡単な" 方法も必要です。

理想的には、チャンクを事前に割り当てて埋めることができる、ファイルでバックアップされた numpy 配列が必要です。次に、numpy 配列メソッド ( maxcumsum、...) を透過的に動作させchunksize、各反復でロードする配列の量を指定するキーワードのみを必要とします。

さらに良いことに、キャッシュと RAM の間ではなく、RAM とハード ドライブの間で動作するNumexprが必要です。

実用的なオプションは何ですか

最初のオプションとして、pyTables の実験を開始しましたが、その複雑さと抽象化に満足していません (numpy とは大きく異なります)。さらに、私の現在のソリューション(以下を参照)は醜く、あまり効率的ではありません。

だから私が答えを求める私の選択肢は

  1. 必要な機能を備えた numpy 配列を実装する (どのように?)

  2. よりスマートな方法でpytableを使用する(異なるデータ構造/メソッド)

  3. h5py、blaze、pandas などの別のライブラリを使用します (これまで試したことはありません)。

暫定的な解決策 (pyTables)

シミュレーション パラメーターを'/parameters'グループに保存します。各パラメーターは numpy 配列スカラーに変換されます。詳細なソリューションですが、機能します。

データをチャンクで生成し、新しいチャンクごとに追加する必要があるため (ただし、最終的なサイズはわかっています)、emission拡張可能な配列 ( ) として保存します。EArray貯蓄countsはもっと問題です。pytable 配列のように保存すると、「counts >= 2」のようなクエリを実行するのが難しくなります。したがって、カウントを複数のテーブル (パーティクルごとに 1 つ) [UGLY] として保存し、.get_where_list('counts >= 2'). これがスペース効率に優れているかどうかはわかりません。単一の配列を使用する代わりにこれらすべてのテーブルを生成すると、HDF5 ファイルが大幅に破壊されます。さらに、奇妙なことに、これらのテーブルを作成するには、カスタム dtype を作成する必要があります (標準の numpy dtype の場合でも):

各粒子カウント「テーブル」には異なる名前 ( name = "particle_%d" % ip) があり、簡単に反復できるようにそれらを Python リストに入れる必要があります。

編集: この質問の結果は、PyBroMoと呼ばれるブラウン運動シミュレーターです。

0 投票する
2 に答える
20099 参照

python - h5pyを使用してpythonでmatlab配列を読み取る方法

2GBを超えるmatlab配列があります...h5pyを使用して読み取りたいです。データは単純な 3D double 配列です。しかし、私は単にインターネット上で手がかりを見つけることができませんでした.

誰かが私を助けることができますか?それがどのように行われたか、例が必要です。h5py のドキュメントは役に立ちませんでした。

0 投票する
0 に答える
458 参照

python - h5py を使用した 2D/4D マスク配列の効率的な読み込み

HDF5 ファイルの大きな 4 次元配列に格納されたデータがあります。各ファイルの次元は (Time,x,y,z) です。時間列のサブセットをx、y、z 値の一部と共にロードして、2D (T,location) 行列を取得したいと考えています。ロードしたいすべての x、y、z 位置の 3D 論理マスクがあります。私の質問は、保存されたデータを 2D に再フォーマットしたほうがよいのでしょうか?

hdf5マスキング構文では、論理配列を単一次元のマスクとして使用できますが、複数次元は使用できないため、答えは簡単に「はい」だと思いました。コード例:

MyTestScript.py

h5py に関する私の現在の理解に基づいて、リストされている 2 番目のオプション (「データ」が 2D 配列の場合) は、配列全体をロードすることはないため、はるかに高速にロードする必要があるように見えます。また、上記と同様のコードの最初のパス テストでは、大幅に高速化されます (約 10 倍高速 - 実際のスクリプトでタイミング チェックを行いました)。

ただし、コードの最初の実行後、時間差はほぼ完全になくなります。hdf5ファイル(またはコードのインタープリター?)が完全にロードされたデータを何らかの方法でキャッシュしたかのように、両方のバージョンがはるかに高速にロードされます。毎回別々のpythonセッション(python MyTestScript.py)で行っているため、それがどのように行われているのかわかりません。

どうしたの?高速化のソースは?いつそれが起こると期待できますか?

洞察に感謝します。