gpt4 book ai didi

python - 使用外部命令多重处理数千个文件

转载 作者:行者123 更新时间:2023-12-01 03:11:50 24 4
gpt4 key购买 nike

我想从 Python 启动大约 8000 个文件的外部命令。每个文件都独立于其他文件进行处理。唯一的限制是在处理完所有文件后继续执行。我有 4 个物理核心,每个核心有 2 个逻辑核心(multiprocessing.cpu_count() 返回 8)。我的想法是使用四个并行独立进程的池,这些进程将在 8 个内核中的 4 个上运行。这样我的机器就可以同时使用了。

这是我一直在做的事情:

import multiprocessing
import subprocess
import os
from multiprocessing.pool import ThreadPool


def process_files(input_dir, output_dir, option):
pool = ThreadPool(multiprocessing.cpu_count()/2)
for filename in os.listdir(input_dir): # about 8000 files
f_in = os.path.join(input_dir, filename)
f_out = os.path.join(output_dir, filename)
cmd = ['molconvert', option, f_in, '-o', f_out]
pool.apply_async(subprocess.Popen, (cmd,))
pool.close()
pool.join()


def main():
process_files('dir1', 'dir2', 'mol:H')
do_some_stuff('dir2')
process_files('dir2', 'dir3', 'mol:a')
do_more_stuff('dir3')

对于100个文件的批处理,顺序处理需要120秒。上面概述的多处理版本(函数 process_files)只需要 20 秒即可完成批处理。但是,当我对整组 8000 个文件运行 process_files 时,我的电脑挂起并且在一小时后没有解冻。

我的问题是:

1) 我认为 ThreadPool 应该初始化一个进程池(确切地说,是 multiprocessing.cpu_count()/2 进程)。然而,我的计算机在 8000 个文件上挂起,但在 100 个文件上挂起,这表明可能没有考虑池的大小。要么是这样,要么我做错了什么。你能解释一下吗?

2)当每个进程都必须启动外部命令时,这是在Python下启动独立进程的正确方法吗?这样所有的资源都不会被处理占用?

最佳答案

我认为你的基本问题是使用subprocess.Popen。该方法在返回之前等待命令完成。由于该函数立即返回(即使该命令仍在运行),因此就您的 ThreadPool 而言,该函数已完成,并且它可以生成另一个......这意味着您最终会生成 8000 个左右的进程。

使用subprocess.check_call,您可能会有更好的运气:

Run command with arguments.  Wait for command to complete.  If
the exit code was zero then return, otherwise raise
CalledProcessError. The CalledProcessError object will have the
return code in the returncode attribute.

所以:

def process_files(input_dir, output_dir, option):
pool = ThreadPool(multiprocessing.cpu_count()/2)
for filename in os.listdir(input_dir): # about 8000 files
f_in = os.path.join(input_dir, filename)
f_out = os.path.join(output_dir, filename)
cmd = ['molconvert', option, f_in, '-o', f_out]
pool.apply_async(subprocess.check_call, (cmd,))
pool.close()
pool.join()

如果您确实不关心退出代码,那么您可能需要 subprocess.call,它不会在进程出现非零退出代码时引发异常。

关于python - 使用外部命令多重处理数千个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42834160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com