跨不同文件的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

试图更好地理解这一点:

我有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 (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文件位于不同的磁盘上),那么您就不必费心了,因为您不会从中获得更高的速度

要并行化,基本上有两种选择:

  • python:您需要使用多处理,正如您所建议的。但要实现这一点,您不能只导入多处理,您需要明确说明每个进程需要做什么,例如:

    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
    
    需要注意的几点:

    • 使用
      Pool(None,…)
      python将计算出您拥有的核心数量,并将为每个cpu核心启动一个进程
    • 使用
      Queue
      可以帮助您永远不会有空闲进程:如果其中一个进程处理完他的文件,它将占用队列中的下一个进程
  • bash:由于您似乎不熟悉pythons的多处理,而且不同的进程不需要相互对话,因此可以并行启动4个python程序,例如

    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解决方案更易于实现,并且可能足以满足您的用例。