跨不同文件的python多处理
试图更好地理解这一点: 我有20多个“大”日志(每个日志大约6-9Gig,但压缩了ie日志1…20.gz) 我的python脚本将遍历指定目录中的每个日志,计算出特定列的总数,然后写入一个文件并转到下一个日志文件。我注意到,当我这样做时,我没有使用系统中的所有内核。所以为了使用更多的内核,我做了这个跨不同文件的python多处理,python,python-2.7,multiprocessing,Python,Python 2.7,Multiprocessing,试图更好地理解这一点: 我有20多个“大”日志(每个日志大约6-9Gig,但压缩了ie日志1…20.gz) 我的python脚本将遍历指定目录中的每个日志,计算出特定列的总数,然后写入一个文件并转到下一个日志文件。我注意到,当我这样做时,我没有使用系统中的所有内核。所以为了使用更多的内核,我做了这个 script1.py < folder 1 (contains logs 1-5 , write to report1-5.txt) script2.py < folder 2
script1.py < folder 1 (contains logs 1-5 , write to report1-5.txt)
script2.py < folder 2 (contains logs 6-10, write to report6-10.txt)
script3.py < folder 3 (contains logs 11-15, write to report11-15.txt)
script4.py < folder 4 (contains logs 16-20, write to report16-20.txt
script1.py<文件夹1(包含日志1-5,写入report1-5.txt)
script2.py<文件夹2(包含日志6-10,写入report6-10.txt)
script3.py<文件夹3(包含日志11-15,写入report11-15.txt)
script4.py<文件夹4(包含日志16-20,写入report16-20.txt
理想情况下,我只需要script1.py<文件夹1(包含所有20个日志并写入report.txt)
如果启用“导入多处理”我是否能够实现一个脚本和许多工作人员浏览不同的文件,还是有许多工作人员试图处理sale log.gz文件?还是我无法解释信息如果我正确理解了您的问题,那么您正在寻找一种加快处理gzip压缩日志文件的好方法 您需要回答的第一个问题是,您当前的进程是CPU绑定还是IO绑定。这意味着:当您当前运行
script.py
,并使用top
进行观察时,您的进程是否达到100%的CPU使用率?如果是,则您的进程是CPU绑定的(即CPU是瓶颈)。如果是这种情况,那么python中的并行化将对您有所帮助。如果不是这样的话(当然不是因为光盘会成为您的瓶颈,除非gz文件位于不同的磁盘上),那么您就不必费心了,因为您不会从中获得更高的速度
要并行化,基本上有两种选择:
from multiprocessing import Pool, Queue
def crunch_file(queue):
while not queue.empty()
filename = queue.get()
# gunzip file, do processing, write to reportx-y.txt
if __name__ == '__main__':
queue = Queue()
# put all filenames into queue with os.walk() and queue.put(filename)
pool = Pool(None, crunch_file, (queue,))
pool.close() # signal that we won't submit any more tasks to pool
pool.join() # wait until all processes are done
需要注意的几点:
- 使用
python将计算出您拥有的核心数量,并将为每个cpu核心启动一个进程Pool(None,…)
- 使用
可以帮助您永远不会有空闲进程:如果其中一个进程处理完他的文件,它将占用队列中的下一个进程Queue
script.py < folder 1 &
script.py < folder 2 &
script.py < folder 3 &
script.py < folder 4 &
script.py<文件夹1&
script.py<文件夹2&
script.py<文件夹3&
script.py<文件夹4&
是的,你的思路是正确的。我一直都在做类似的事情。运行得更快。你需要先解压缩文件。对文件进行全局搜索,然后将它们以文件名列表的形式传递到pool.map(fn,lst)我应该添加一个SSD,这是我使用的,如果你使用一个正常的旋转HD,可能根本不会有速度提升。遗憾的是,SSD在这方面很好。不要使用队列、关闭、连接,所有不必要的,所以只需使用map()我无法快速解压100个6-7G大小的log.gz文件。在处理和输出它们之前,我已经将它们以gz格式逐行读取到内存中。这是一个很好的描述。那么..1和2在分散负载方面基本上是做同样的事情吗?@chowpay基本上他们也在做同样的事情,yes、 使用python,您可以更好地控制,因为您可以将负载更均匀地分配到核心。此外,您还可以利用所有核心,即使文件夹的数量小于核心的数量。也就是说,bash解决方案更易于实现,并且可能足以满足您的用例。