2

大量の ~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) どうすればこれを達成できますか?

ありがとうございました...ここにいる皆さんはすでに信じられないほど役に立ちました! 〜ニック

4

2 に答える 2

4

mmap(2)マニュアルページから:

   ENODEV The  underlying  file system of the specified file does not sup-
          port memory mapping.

ストリームを mmap することはできません。実際のファイルまたは匿名のスワップ スペースのみです。自分でストリームからメモリに読み込む必要があります。

于 2011-06-28T17:48:31.857 に答える
1

パイプは mmapable ではありません。

case MAP_PRIVATE:
      ...
if (!file->f_op || !file->f_op->mmap)
        return -ENODEV;

mmapパイプのファイル操作にはフックが含まれていません。

于 2011-06-28T17:50:20.700 に答える