私は、ASCIIヘッダーを含むいくつかの大きな(約10GBのgzipされた)ファイルを持っています。次に、原則として、それぞれ約3MBのnumpy.recarraysを「イベント」と呼びます。私の最初のアプローチは次のようになりました。
f = gzip.GzipFile(filename)
f.read(10000) # fixed length ascii header
event_dtype = np.dtype([
('Id', '>u4'), # simplified
('UnixTimeUTC', '>u4', 2),
('Data', '>i2', (1600,1024) )
])
event = np.fromfile( f, dtype = event_dtype, count=1 )
ただし、 np.fromfile は実際に低レベルの呼び出しを行うため、実際の FILE オブジェクトが必要であるため、これは不可能です (かなり古いチケットhttps://github.com/numpy/numpy/issues/1103が見つかりました)。
だから私が理解しているように、私はこのようにしなければなりません:
s = f.read( event_dtype.itemsize )
event = np.fromstring(s, dtype=event_dtype, count=1)
そして、はい、それは動作します! しかし、これは非常に非効率的ではありませんか? s のメモリが割り当てられていないか、イベントごとにガベージ コレクションが行われていませんか? 私のラップトップでは、16イベント/秒、つまり〜50MB/秒に達します
memを一度割り当ててから、numpyにそのmemを直接読み込ませる賢い方法を誰かが知っているのではないかと思います。
ところで。私は物理学者なので、この業界ではまだ初心者です。