Skip to main content
 首页 » 编程设计

使用线程或多处理的 Python for 循环

2025年05月04日6hnrainll

全部, 我是新手,正在寻求帮助。我需要对压缩约 20 GB 数据的数据集执行字符串搜索。我有一个带有 32 GB RAM 的八核 ubuntu 盒子,我可以用它来处理这个问题,但我无法实现也无法确定此类任务的最佳代码。 Threading 或 multiprocessing 最适合这样的任务吗?请提供代码示例。谢谢。 请查看我当前的代码;

#!/usr/bin/python 
import sys 
logs = [] 
iplist = [] 
 
logs = open(sys.argv[1], 'r').readlines() 
iplist = open(sys.argv[2], 'r').readlines() 
print "+Loaded {0} entries for {1}".format(len(logs), sys.argv[1]) 
print "+Loaded {0} entries for {1}".format(len(iplist), sys.argv[2]) 
 
for a in logs: 
    for b in iplist: 
        if a.lower().strip() in b.lower().strip() 
            print "Match! --> {0}".format(a.lower().strip()) 

请您参考如下方法:

我不确定多线程是否可以帮助您,但您的代码存在一个对性能不利的问题:一次读取日志会消耗大量 RAM 并破坏您的缓存。相反,打开它并按顺序阅读,毕竟你是在进行顺序扫描,不是吗?然后,不要对相同的数据重复任何操作。特别是,iplist 没有改变,但是对于每个日志条目,您都在重复调用 b.lower().strip()。在读取包含 IP 地址的文件后执行一次。

简而言之,这看起来像这样:

with open(..) as f: 
    iplist = [l.lower().strip() for l in f] 
 
with open(..) as f: 
    for l in f: 
        l = l.lower().strip() 
        if l in iplist: 
            print('match!') 

您可以通过为 iplist 使用集合来进一步提高性能,因为当元素很多时,在那里查找内容会更快。也就是说,我假设第二个文件很大,而 iplist 将保持相对较小。

顺便说一句:您可以通过使用一个读取文件和另一个扫描匹配项来提高多个 CPU 的性能,但我想上面的内容已经给了您足够的性能提升。