全部, 我是新手,正在寻求帮助。我需要对压缩约 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 的性能,但我想上面的内容已经给了您足够的性能提升。
