Pythonで処理しようとしている既知のフォーマットされた数値の約1.000.000行で構成される大きなASCIIファイル(〜100GB)があります。ファイルが大きすぎてメモリに完全に読み込むことができないため、ファイルを 1 行ずつ処理することにしました。
fp = open(file_name)
for count,line in enumerate(fp):
data = np.array(line.split(),dtype=np.float)
#do stuff
fp.close()
プログラムの実行時間のほとんどをこのdata =
行に費やしていることがわかりました。その回線を高速化する方法はありますか? また、実行速度は、フォーマットされた読み取りを使用したネイティブ FORTRAN プログラムから取得できる速度よりもはるかに遅いようです (この質問を参照してください。FORTRAN 文字列プロセッサを実装して f2py で使用しましたが、実行時間は次のdata =
行とのみ比較できました。 . Python/FORTRAN 間の I/O 処理と型変換が、FORTRAN から得たものを台無しにしたと思います)
私は書式設定を知っているので、使用するためのより良い、より高速な方法があるべきではありませんsplit()
か? 何かのようなもの:
data = readf(line,'(1000F20.10)')
fortranformatパッケージを試してみましたが、うまくいきましたが、私の場合は 3 倍遅くなりましsplit()
た。
PS ExP とルートで提案されているように、np.fromstring を試して、この迅速で汚れたベンチマークを作成しました。
t1 = time.time()
for i in range(500):
data=np.array(line.split(),dtype=np.float)
t2 = time.time()
print (t2-t1)/500
print data.shape
print data[0]
0.00160977363586
(9002,)
0.0015162509
と:
t1 = time.time()
for i in range(500):
data = np.fromstring(line,sep=' ',dtype=np.float,count=9002)
t2 = time.time()
print (t2-t1)/500
print data.shape
print data[0]
0.00159792804718
(9002,)
0.0015162509
実際、fromstring
私の場合は少し遅いです。