gpt4 book ai didi

Python字符串处理优化

转载 作者:行者123 更新时间:2023-11-28 21:16:23 25 4
gpt4 key购买 nike

所以最近我一直在制作一个 python 脚本,用于从大型文本文件 ( > 1 GB ) 中提取数据。问题基本上归结为从文件中选择文本行,并在其中搜索某个数组中的字符串(该数组中可以包含多达 1000 个字符串)。这里的问题是我必须找到该字符串的特定出现,并且该字符串可能会在该文件中出现无限次。此外,还需要一些解码和编码,这会额外减慢脚本速度。代码看起来像这样:

strings = [a for a in open('file.txt')]

with open("er.txt", "r") as f:
for chunk in f:
for s in strings
#do search, trimming, stripping ..

我的问题是:有没有办法优化这个?我尝试了多处理,但它帮助不大(或者至少是我实现它的方式)这里的问题是这些 block 操作不是独立的,并且 strings 列表可能会在其中一个过程中被改变。任何优化都会有所帮助(字符串搜索算法、文件读取等)我在循环中断方面做了尽可能多的工作,但它仍然运行得很慢。

最佳答案

如果您能准确知道字符串是如何以二进制(ASCII、UTF-8)编码的,则可以 mmap一次将整个文件存入内存;它的行为与通过 file.read() 获取的大型 bytearray/bytes(或 Python 2 中的 str)完全一样;那么这样的 mmap 对象将可以通过 str 正则表达式(Python 2)或 bytes 正则表达式(Python 3)搜索。

mmap 是许多操作系统上最快的解决方案,因为只读映射意味着操作系统可以在页面准备就绪时自由映射;不需要交换空间,因为数据由文件支持。操作系统还可以通过零复制直接映射缓冲区高速缓存中的数据 - 因此与裸读相比是双赢的。

例子:

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('utf8')))

mm.close()

现在,如果 datafile.txt 包含文本:

the ultimate answer is 42

在 1 GB 数据的某个地方,这个程序将是最快的 python 解决方案之一:

The answer is 42

注意 pattern.finditer还接受可用于限制尝试匹配范围的 startend 参数。


ivan_pozdeev 所述,这需要 1 GB 的可用虚拟地址空间来映射 GB 文件(但不一定是 1 GB 的 RAM),这在 32 位进程中可能很困难,但几乎可以肯定地认为在 64 位上“没有问题”位操作系统和CPU。在 32 位进程上,该方法仍然有效,但您需要将大文件映射为较小的 block - 因此现在操作系统和处理器的位非常重要。

关于Python字符串处理优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28643919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com