<p>如果您能够确切地知道字符串是如何以二进制(ASCII,UTF-8)编码的,那么您可以一次将整个</em>文件<a href="https://docs.python.org/3/library/mmap.html" rel="nofollow noreferrer">^{<cd1>}</a>放入内存;它的行为与<code>bytearray/bytes</code>(或python2中的<code>str</code>)完全相同;那么这样的<code>mmap</code>对象可以通过<code>str</code>正则表达式(Python 2)或<code>bytes</code>来搜索正则表达式(Python3)。在</p>
<p><code>mmap</code>是许多操作系统上最快的解决方案,因为只读映射意味着操作系统可以在页面准备就绪时自由映射;不需要交换空间,因为数据由文件支持。操作系统还可以通过零拷贝直接映射缓冲区缓存中的数据,从而实现对裸读的双赢。在</p>
<p>示例:</p>
<pre><code>import mmap
import re
pattern = 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).decode('ascii')))
mm.close()
</code></pre>
<p>现在,如果<code>datafile.txt</code>包含文本:</p>
^{pr2}$
<p>在1GB数据的某个地方,这个程序将是最快的python解决方案之一:</p>
^{3}$
<p>请注意,<a href="https://docs.python.org/3/library/re.html#re.RegexObject.finditer" rel="nofollow noreferrer">^{<cd10>}</a>还接受<code>start</code>和{<cd12>}参数,这些参数可用于限制尝试匹配的范围。在</p>
<hr/>
<p>正如<a href="https://stackoverflow.com/users/648265/ivan-pozdeev">ivan_pozdeev</a>所指出的,这需要1GB的空闲虚拟地址空间来映射一个千兆字节的文件(但不一定是1GB的RAM),这在32位进程中可能很困难,但几乎可以肯定的是,在64位操作系统和CPU上“没有问题”。在32位进程上,这种方法仍然有效,但是您需要将大文件映射成更小的块—因此现在操作系统和处理器的位确实很重要。在</p>