2

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

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

1 回答 1

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 将保持相对较小。

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

于 2013-04-20T07:27:39.117 回答