简单的问题是,在python中使用了一个巨大的OR正则表达式。我正在构建一个脚本来搜索坏文件。到目前为止,我有一个包含50个左右“签名”的源文件。该清单的形式为:
Djfsid
LJflsdflsdf
fjlsdlf
fsdf
.
.
.
没有真正的“通信”,所以通过删除“重复”或检查“是一个条目是另一个条目的子字符串”来优化列表将不会做太多。
我基本上不想操作系统走下目录,打开文件,检查签名,关闭并继续。
为了加快速度,我将列表分成50个/ n个不同的子列表,其中N是核心数,并且线程可以对列表中的几个条目起作用。
使用巨型正则表达式re.search('(entry1|entry2|entry3....|entryK)', FILE_CONTENTS)
或巨型for i in xrange(0,NUM_SUBENTRIES)...if subentry[i] in FILE_CONTENTS...
会更好吗?
这也是多线程的好方法吗?这是unix,因此多个线程可以同时在同一个文件上工作。磁盘访问基本上会让我陷入多线程无用的地步吗?
答案 0 :(得分:3)
这也是多线程的好方法吗?
不是。
磁盘访问基本上会让我陷入多线程无用的地步吗?
正确。
您可能需要仔细查看multiprocessing
。
工作人员Process
应该执行OS.walk并将文件名放入队列中。
工作组Process
实例池。每个人都将从队列中获取文件名,打开它,检查签名并将结果排入“好”队列和“坏”队列。创建尽可能多的CPU,使CPU 100%忙碌。
另一个工作人员Process
实例可以将好的条目出列并记录下来。
另一个工作Process
实例可以将错误的条目出列并删除或重命名或者应该发生的任何事情。这可能会干扰os.walk。可能是将这些文件记录到“执行此操作”文件中,该文件在 os.walk完成后处理。
答案 1 :(得分:0)
这取决于您使用的机器。如果你使用机器的最大功能,它当然会减慢速度。我认为最好的方法就是尝试。
答案 2 :(得分:0)
不要担心优化。
与计算机管理的数据相比,50个数据点很小,因此您可能会浪费大量时间,并使程序更加复杂。