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

时间:2013-04-20 03:01:13

标签: python multithreading multiprocessing

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

#!/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())

1 个答案:

答案 0 :(得分:1)

我不确定多线程是否可以帮助您,但是您的代码存在一个对性能有害的问题:一次性读取日志会消耗大量的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仍然相对较小。

BTW:您可以通过使用一个来读取文件而另一个来扫描匹配来提高多CPU的性能,但我想上面的内容已经为您提供了足够的性能提升。