在Python中';s的多处理模块,在for循环中调用工作池是否是一种良好的做法?

在Python中';s的多处理模块,在for循环中调用工作池是否是一种良好的做法?,python,multiprocessing,python-multithreading,Python,Multiprocessing,Python Multithreading,在for循环中调用pool.map以最小化内存使用是一种好的做法吗 例如,在我的代码中,我试图通过一次只处理一个目录来最小化内存使用: 路径=/dir/文件 def readMedia(fname): """ Do CPU-intensive task """ pass def init(queue): readMedia.queue = queue def main(): print("Starting the scanner in root " + PATH)

在for循环中调用pool.map以最小化内存使用是一种好的做法吗

例如,在我的代码中,我试图通过一次只处理一个目录来最小化内存使用:

路径=/dir/文件

def readMedia(fname):
   """ Do CPU-intensive task
   """
   pass

def init(queue):
  readMedia.queue = queue

def main():
  print("Starting the scanner in root " + PATH)

  queue = multiprocessing.Queue()
  pool = multiprocessing.Pool(processes=32, initializer=init, initargs=[queue])

  for dirpath, dirnames, filenames in os.walk(PATH):
    full_path_fnames = map(lambda fn: os.path.join(dirpath, fn),
                       filenames)
    pool.map(readMedia, full_path_fnames)

    result = queue.get()
    print(result)

上面的代码在测试时实际上会占用我所有的内存,即使脚本被终止

这里可能有一些问题。首先,您在池中使用了太多进程。由于您正在执行CPU密集型任务,因此,如果您启动的多个
多处理。CPU\u count()
工作者;如果您有32个工人在执行CPU密集型任务,但只有4个CPU,那么28个进程总是无所事事,只会浪费内存

由于一个或多个子进程仍在运行,因此在终止脚本后,您可能仍会看到高内存使用率。杀死主脚本后,请查看进程列表,并确保没有任何子进程落在后面

如果您仍然看到内存使用率随着时间的推移而增长过快,可以尝试在创建池时设置
maxtasksparchild
关键字参数,该参数将在每个子进程运行给定数量的任务后重新启动,释放任何可能泄漏的内存


至于通过在for循环中调用
map
获得的内存使用收益,您确实可以获得这样的优势,即不必将每次调用
readMedia
的结果存储在一个内存列表中,如果有大量文件被迭代,这肯定会节省内存

这里可能有一些问题。首先,您在池中使用了太多进程。由于您正在执行CPU密集型任务,因此,如果您启动的多个
多处理。CPU\u count()
工作者;如果您有32个工人在执行CPU密集型任务,但只有4个CPU,那么28个进程总是无所事事,只会浪费内存

由于一个或多个子进程仍在运行,因此在终止脚本后,您可能仍会看到高内存使用率。杀死主脚本后,请查看进程列表,并确保没有任何子进程落在后面

如果您仍然看到内存使用率随着时间的推移而增长过快,可以尝试在创建池时设置
maxtasksparchild
关键字参数,该参数将在每个子进程运行给定数量的任务后重新启动,释放任何可能泄漏的内存


至于通过在for循环中调用
map
获得的内存使用收益,您确实可以获得这样的优势,即不必将每次调用
readMedia
的结果存储在一个内存列表中,如果有大量文件被迭代,这肯定会节省内存

这里可能有一些问题。首先,您在池中使用了太多进程。由于您正在执行CPU密集型任务,因此,如果您启动的多个
多处理。CPU\u count()
工作者;如果您有32个工人在执行CPU密集型任务,但只有4个CPU,那么28个进程总是无所事事,只会浪费内存

由于一个或多个子进程仍在运行,因此在终止脚本后,您可能仍会看到高内存使用率。杀死主脚本后,请查看进程列表,并确保没有任何子进程落在后面

如果您仍然看到内存使用率随着时间的推移而增长过快,可以尝试在创建池时设置
maxtasksparchild
关键字参数,该参数将在每个子进程运行给定数量的任务后重新启动,释放任何可能泄漏的内存


至于通过在for循环中调用
map
获得的内存使用收益,您确实可以获得这样的优势,即不必将每次调用
readMedia
的结果存储在一个内存列表中,如果有大量文件被迭代,这肯定会节省内存

这里可能有一些问题。首先,您在池中使用了太多进程。由于您正在执行CPU密集型任务,因此,如果您启动的多个
多处理。CPU\u count()
工作者;如果您有32个工人在执行CPU密集型任务,但只有4个CPU,那么28个进程总是无所事事,只会浪费内存

由于一个或多个子进程仍在运行,因此在终止脚本后,您可能仍会看到高内存使用率。杀死主脚本后,请查看进程列表,并确保没有任何子进程落在后面

如果您仍然看到内存使用率随着时间的推移而增长过快,可以尝试在创建池时设置
maxtasksparchild
关键字参数,该参数将在每个子进程运行给定数量的任务后重新启动,释放任何可能泄漏的内存


至于通过在for循环中调用
map
获得的内存使用收益,您确实可以获得这样的优势,即不必将每次调用
readMedia
的结果存储在一个内存列表中,如果有大量文件被迭代,这肯定会节省内存

当设置进程=1或进程=2时会发生什么?同样的行为?您要处理多少完整路径名称?不确定os.walk是否存在链接周期问题。如果您从根目录开始,则可能只是使用
full\u path\u fnames=
获得的文件数。。。我会先找出你有多少个fname,然后试着从一个只有几个文件的目录开始,看看你是否能获得基本功能。当你设置processs=1或processs=2时会发生什么?同样的行为?您要处理多少完整路径名称?不确定是否有操作系统。