大量の ~40MB の gzip 圧縮されたテキスト ファイルを読み込んで処理する必要があり、高速かつ最小の I/O オーバーヘッドで実行する必要があります (ボリュームは他のユーザーによっても使用されるため)。このタスクのために私が見つけた最速の方法は次のようになります。
def gziplines(fname):
f = Popen(['zcat', fname], stdout=PIPE)
for line in f.stdout:
yield line
その後:
for line in gziplines(filename)
dostuff(line)
しかし、私がやりたいこと (これがより速い場合) は次のようなものです:
def gzipmmap(fname):
f = Popen(['zcat', fname], stdout=PIPE)
m = mmap.mmap(f.stdout.fileno(), 0, access=mmap.ACCESS_READ)
return m
悲しいことに、これを試してみると、次のエラーが発生します。
>>> m = mmap.mmap(f.stdout.fileno(), 0, access=mmap.ACCESS_READ)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
mmap.error: [Errno 19] No such device
それでも、私が試してみると:
>>> f.stdout.fileno()
4
ですから、ここで何が起こっているのかについて、基本的な誤解があると思います。:(
2 つの質問は次のとおりです。
1) この mmap は、処理のためにファイル全体をメモリに入れるためのより高速な方法でしょうか?
2) どうすればこれを達成できますか?
ありがとうございました...ここにいる皆さんはすでに信じられないほど役に立ちました! 〜ニック