0

バイナリ テーブルを含む 60GB の FITS ファイルがあります。このテーブルを一度に 1 つの行/エントリ/行/ブロック* で読み取り (および処理) したいと思います。

(※正確な命名法はわかりません)

私はpyfitsを使用していますが、やりたいことは簡単に言えば次のとおりです。

import pyfits

hdulist = = pyfits.open("file.fits")
# the binary table has to be in the 2nd extension
# hence it is in hdulist[1]

n_entries = hdulist[1].header['NAXIS2']

for i in xrange(n_entries):
    entry = hdulist[1].data[i]  # I am confused what happens at this step

    # now do stuff with the values in entry
    # .....

変数entryの型<class 'pyfits.fitsrec.FITS_record'>は、バイナリ テーブルの列数と同じ長さです。ただし、次の行でバイナリ テーブル全体がメモリに読み込まれるように見えますentry = hdulist[1].data[i]

pyfits のドキュメントを調べましたが、テーブル エントリごとに (または一度に小さなエントリ セットで) バイナリ テーブル拡張からデータを読み取るようなメソッドが見つかりません。テーブルから特定のエントリを選択するのではなく、単に順番にスキャンするだけです。

私の質問は次のとおりです。

0)hdulist[1].data[i]ステップで何が起きているか? すべてがメモリに読み込まれるのはなぜですか? (これを回避する方法はありますか?)

1)私は何かを逃しましたか?実際にpyfitsは私が望むことをすることができますか?

2)別のpythonライブラリはありますか?(つまり、FITS 拡張でバイナリ テーブルを使用する)

3)そうでない場合、データを別のバイナリ(または他の圧縮/非ASCII)形式(FITSではない)で書き直して、他のpythonライブラリまたはモジュールを見つけて、やりたいことを実行できますか?

4

1 に答える 1

0

pyfits には現在、テーブルの行反復子がありません。データ列が、ディスク上のストレージ形式から「物理」値への変換を必要としないようなものである場合、テーブルの読み取りは高速です。しかし、それ以外の場合、現在、そのような列を読み取ろうとすると爆発します。テーブル インターフェースが書き直されているので、私はあまり抵抗しませんが、それまでの間、CFITSIO の Python ラッパーであり、テーブルの効率的な行ベースの反復を提供する fitio ライブラリを試してみることをお勧めします。

于 2014-04-09T14:36:57.813 に答える