【问题标题】:Python - multiprocessing and text file processingPython - 多处理和文本文件处理
【发布时间】:2017-06-18 01:06:15
【问题描述】:

背景: 我有一个巨大的文件.txt,我必须处理它。这是一个data mining 项目。 因此,我将其拆分为多个 .txt 文件,每个文件大小为 100MB,将它们全部保存在同一个目录中并设法以这种方式运行它们:

from multiprocessing.dummy import Pool

for filename in os.listdir(pathToFile):
    if filename.endswith(".txt"):
       process(filename)
    else:
       continue

在进程中,我将文件解析为对象列表,然后应用另一个函数。这比按原样运行整个文件。但是对于足够大的文件,我将无法立即运行,我将不得不切片。所以我想要线程,因为我不必等待每个 process(filename) 完成。

我该如何应用它?我检查了this,但我不明白如何将它应用到我的代码中......

如有任何帮助,我们将不胜感激。 我查看了here 以了解如何执行此操作。我试过的:

pool = Pool(6)
for x in range(6):
    futures.append(pool.apply_async(process, filename))

不幸的是,我意识到它只会处理前 6 个文本文件,还是不会?我怎样才能使它工作?线程结束后,立即为其分配另一个文件文本并开始运行。

编辑:

for filename in os.listdir(pathToFile):
    if filename.endswith(".txt"):
       for x in range(6):
           pool.apply_async(process(filename))
    else:
       continue

【问题讨论】:

  • 在循环中传递所有文件名。 6 表示将同时处理 6 个文件。但不确定您是否会因为 python GIL 和线程而获得速度。你应该看看多处理。
  • 你说的是线程池还是进程池?
  • @roganjosh,它是同一个程序,所以它必须是线程,不是吗?
  • @Jean-FrançoisFabre from multiprocessing.dummy import Pool
  • 不,您可以使用 multiprocessing 模块生成多个进程。如前所述,Python 中的 GIL 意味着一次只能有一个线程执行代码,因此多线程不会导致速度的任何提高。

标签: python python-2.7 file-io io python-multiprocessing


【解决方案1】:

首先,使用multiprocessing.dummy 只会在您的问题是 IO 限制(读取文件是主要瓶颈时)时提高速度,对于 CPU 密集型任务(处理文件是瓶颈)将无济于事,在这种情况下,您应该使用“真实”multiprocessing

您描述的问题似乎更适合使用Poolmap 函数之一:

from multiprocessing import Pool
files = [f for f in os.listdir(pathToFile) if f.endswith(".txt")]
pool = Pool(6)
results = pool.map(process, files)
pool.close()

这将使用 6 个工作进程来处理文件列表,并在处理完所有文件后返回 process() 函数的返回值列表。您当前的示例将提交 same 文件 6 次。

【讨论】:

  • 不错,简单的答案。您不必close()join() 池来访问结果吗?
  • 我没有文件列表。我正在使用for filename in os.list... 访问特定文件夹中的所有.txt 文件。
  • @roganjosh 不,您在使用map() 时没有必须使用join(),因为当它返回时,所有工作人员都已经完成了他们的任务。调用 close() 允许工作人员终止,所以这是一个很好的做法,谢谢提示。
  • @HerthaBSCfan files 是一个list comprehension,它为您提供文件名列表。
  • @roganjosh :( 我的程序现在还没有完成。没有池它运行了 20 分钟。池它现在已经运行了一个小时并且仍在运行......
猜你喜欢
  • 1970-01-01
  • 2020-06-21
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
相关资源
最近更新 更多