〜40MBのgzip形式のテキストファイルを読み込んで処理する必要があります。また、ボリュームを他のユーザーも使用するため、I/Oオーバーヘッドを最小限に抑えて高速に処理する必要があります。私はこの作業のためにこれ見つけた最速の方法は、次のようになります。mmapをpopenで使用する
def gziplines(fname):
f = Popen(['zcat', fname], stdout=PIPE)
for line in f.stdout:
yield line
、その後:
for line in gziplines(filename)
dostuff(line)
が、私がやりたいものを(?これは高速です IF)ものです悲しいことに
def gzipmmap(fname):
f = Popen(['zcat', fname], stdout=PIPE)
m = mmap.mmap(f.stdout.fileno(), 0, access=mmap.ACCESS_READ)
return m
、私はこれをしようとすると、私はこのエラーを取得:
このようなにもかかわらず、私は試してみてください。
だから、>>> f.stdout.fileno()
4
、私はここで何が起こっているかの基本的な誤解があると思います。 :(
二つの質問は次のとおりです。
1)は、このMMAPは、処理のためにメモリにファイル全体を置くことで、より高速な方法だろうか?
2)これをどのように達成できますか?
ありがとうございました。皆さん、ここにいる皆さんは、既に非常に役立っています! mmap(2)
manページから 〜ニック
あなたのジェネレータの解決策は、とにかくmmapを使うよりはっきりしています。外部プログラムを呼び出すのではなく、Pythonの標準gzipライブラリを使ってみましたか? http://docs.python.org/library/gzip.html –