如果您确切知道字符串是如何以二进制(ASCII,UTF-8)编码的,则可以一次
mmap将
整个 文件存入内存;它的行为就像will 将获得的大
bytearray/bytes(或
str在Python
2中)
file.read();那么
mmap可以用
str正则表达式(Python 2)或
bytes正则表达式(Python
3)搜索这样的对象。
这
mmap是许多操作系统上最快的解决方案,因为只读映射意味着操作系统可以在页面准备就绪时自由地映射它们。不需要交换空间,因为数据由文件支持。操作系统还可以直接将缓冲区缓存中的数据映射为零拷贝,从而在裸读上实现双赢。
例:
import mmapimport repattern = re.compile(b'the ultimate answer is ([0-9]+)')with open("datafile.txt", "rb") as f: # memory-map the file, size 0 means whole file mm = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) # PROT_READ only on *nix as the file is not writable for match in pattern.finditer(mm): # process match print("The answer is {}".format(match.group(1).depre('utf8'))) mm.close()现在,如果
datafile.txt包含文本:
the ultimate answer is 42
沿着1 GB数据的某个地方,该程序将是最快推出的python解决方案之一:
The answer is 42
请注意,该参数
pattern.finditer还接受
start和
end参数,这些参数可用于限制尝试匹配的范围。
正如van_pozdeev所指出的,这需要1
GB的可用虚拟地址空间来映射1 GB的文件(但不一定是1
GB的RAM),这在32位进程中可能很困难,但几乎可以肯定地认为是“没有问题的”在64位操作系统和CPU上。在32位进程上,该方法仍然有效,但是您需要将大文件映射为较小的块-
因此,操作系统和处理器的位确实很重要。



