我想搜索字符串S是在类别。目录文件保存在文件夹中。我想加载类别文件并搜索S,但是类别文件的大小超过了RAM内存的大小。所以我不能加载目录文件。在这种情况下,我怎么知道字符串S是否在类别中?
最简单的方法是一次一行地处理大文件:
#!/usr/bin/env python3
N = 0
with open('BigFile.txt', 'r') as f:
while True:
line = f.readline()
if not line:
print('No cats found')
break
if 'cat' in line:
print(f'Found cat, on line {N}')
break
N += 1
创建一个包含300万行代码的测试文件,输入"cat"在最后一行像这样:
jot -w "%08d" 3000000 > BigFile.txt
echo cat >> BigFile.txt
或者,您可以使用mmap()
并让操作系统完成工作:
#!/usr/bin/env python3
import mmap
import re
# Open file and mmap it into memory to search in it for "cat"
with open('BigBoy', 'r') as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
match = re.search(b'cat', m)
if match:
print(f'Found {match.re.pattern} at offset {match.start()}')
示例:
首先,创建一个对于RAM来说太大的文件,例如64GB,并加上单词"cat"结尾:
dd if=/dev/zero of=BigBoy bs=1G count=64
echo cat >> BigBoy
现在搜索大于RAM的文件:
./SearchInMmapFile.py
Found b'cat' at offset 68719476736