【发布时间】: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