Python 将mmap与popen一起使用

Python 将mmap与popen一起使用,python,subprocess,popen,mmap,zcat,Python,Subprocess,Popen,Mmap,Zcat,我需要读入并处理一堆~40mb的Gzip文本文件,并且我需要快速完成,并且以最小的I/o开销(因为其他人也使用这些卷)。因此,我为这项任务找到的最快方法如下: def gziplines(fname): f = Popen(['zcat', fname], stdout=PIPE) for line in f.stdout: yield line def gzipmmap(fname): f = Popen(['zcat', fname], stdo

我需要读入并处理一堆~40mb的Gzip文本文件,并且我需要快速完成,并且以最小的I/o开销(因为其他人也使用这些卷)。因此,我为这项任务找到的最快方法如下:

def gziplines(fname): 
    f = Popen(['zcat', fname], stdout=PIPE)
    for line in f.stdout:
        yield line
def gzipmmap(fname): 
    f = Popen(['zcat', fname], stdout=PIPE)
    m = mmap.mmap(f.stdout.fileno(), 0, access=mmap.ACCESS_READ)
    return m
然后:

for line in gziplines(filename)
    dostuff(line)
但是我想做的事情(如果这更快的话?)是这样的:

def gziplines(fname): 
    f = Popen(['zcat', fname], stdout=PIPE)
    for line in f.stdout:
        yield 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
所以,我想我对这里发生的事情有一个基本的误解(

这两个问题是:

1) 在将整个文件放入内存进行处理时,此mmap是一种更快的方法吗

2) 我怎样才能做到这一点

非常感谢你。。。这里的每个人都已经非常乐于助人了! ~Nik

来自
mmap(2)
手册页:

不能映射流,只能映射真实文件或匿名交换空间。您需要自己将数据流读取到内存中。

管道不可移动

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

管道的文件操作不包含
mmap
hook。

无论如何,生成器解决方案比使用mmap更清晰。您是否尝试过使用Python的标准gzip库,而不是调用外部程序?谢谢一年多后回到这个话题上。。。更好地理解mmap和其他一切!