全部, 我很新,正在寻求帮助。我需要对压缩大约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())
答案 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的性能,但我想上面的内容已经为您提供了足够的性能提升。