gpt4 book ai didi

python - Python 中迭代大文件 (10GB+) 的最有效方式

转载 作者:太空狗 更新时间:2023-10-29 17:40:32 25 4
gpt4 key购买 nike

我正在编写一个 Python 脚本来处理两个文件 - 一个包含 UUID 列表,另一个包含大量日志条目 - 每行包含另一个文件中的一个 UUID。该程序的目的是从文件 1 创建 UUID 列表,然后每次在日志文件中找到该 UUID 时,每次找到匹配项时都会增加相关值。

长话短说,统计每个UUID在日志文件中出现了多少次。目前,我有一个列表,其中填充了 UUID 作为键,“hits”作为值。然后另一个循环遍历日志文件的每一行,并检查日志中的 UUID 是否与 UUID 列表中的 UUID 匹配。如果匹配,它会增加值。

    for i, logLine in enumerate(logHandle):         #start matching UUID entries in log file to UUID from rulebase
if logFunc.progress(lineCount, logSize): #check progress
print logFunc.progress(lineCount, logSize) #print progress in 10% intervals
for uid in uidHits:
if logLine.count(uid) == 1: #for each UUID, check the current line of the log for a match in the UUID list
uidHits[uid] += 1 #if matched, increment the relevant value in the uidHits list
break #as we've already found the match, don't process the rest
lineCount += 1

它可以正常工作 - 但我确信有一种更有效的方法来处理文件。我浏览了一些指南,发现使用“计数”比使用已编译的正则表达式更快。我认为以 block 而不是逐行读取文件会通过减少磁盘 I/O 时间来提高性能,但是测试文件的性能差异 ~200MB 可以忽略不计。如果有人有任何其他方法,我将不胜感激:)

最佳答案

功能性思考!

  1. 编写一个函数,它将获取日志文件的一行并返回 uuid。称它为 uuid,比如说。

  2. 将此函数应用于日志文件的每一行。如果您使用的是 Python 3,则可以使用内置函数映射;否则,您需要使用 itertools.imap。

  3. 将此迭代器传递给 collections.Counter。

    collections.Counter(map(uuid, open("log.txt")))

这将是非常高效的。

一些评论:

  • 这完全忽略了 UUID 列表,只计算出现在日志文件中的 UUID。如果您不想这样做,则需要对程序进行一些修改。

    • 您的代码运行缓慢,因为您使用了错误的数据结构。字典就是您想要的。

关于python - Python 中迭代大文件 (10GB+) 的最有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6215523/

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