Python-多处理和文本文件处理

Python-多处理和文本文件处理,python,python-2.7,file-io,io,python-multiprocessing,Python,Python 2.7,File Io,Io,Python Multiprocessing,背景: 我有一个巨大的文件.txt,我必须处理它。这是一个数据挖掘项目。 因此,我将其拆分为多个.txt文件,每个文件的大小均为100MB并将其保存在同一目录中,并以这种方式运行: 来自multiprocessing.dummy导入池的 for filename in os.listdir(pathToFile): if filename.endswith(".txt"): process(filename) else: continue 在这个过程

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

来自multiprocessing.dummy导入池的

for filename in os.listdir(pathToFile):
    if filename.endswith(".txt"):
       process(filename)
    else:
       continue
在这个过程中,我将文件解析为对象列表,然后应用另一个函数。这比按原样运行整个文件要慢。但对于足够大的文件,我将无法立即运行,我将不得不切片。所以我想要线程,因为我不必等待每个
进程(文件名)
完成

我如何应用它?我已经检查过了,但我不知道如何将它应用到我的代码中

任何帮助都将不胜感激。 我想看看怎么做。我所尝试的:

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

首先,使用
多处理.dummy
只能在您的问题是IO限制(读取文件是主要瓶颈)时提高速度,对于CPU密集型任务(处理文件是瓶颈)没有帮助,在这种情况下,您应该使用“real”
多处理

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

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()
函数的返回值列表。当前示例将提交同一文件6次。

在循环中传递所有文件名。6表示将同时处理6个文件。但是,由于pythongil和线程的存在,不能确定您是否能够提高速度。你应该看看多处理。你说的是线程池还是进程池?@roganjosh,它是同一个程序,所以它必须是线程,不是吗?@Jean Françoisfare
来自multiprocessing.dummy import Pool
不,你可以使用该模块生成多个进程。如前所述,Python中的GIL意味着一次只能有一个线程执行代码,因此多线程不会导致速度的任何提高。回答很好,很简单。你不需要
close()
join()
池才能访问结果吗?我没有文件列表。我在os.list中使用
作为文件名…
来访问特定文件夹中的所有
.txt
文件。@roganjosh不,使用
map()
时不必使用
join()
,因为当它返回时,所有工作人员都已经完成了任务。调用
close()
允许工作进程终止,这是一个很好的做法,谢谢您的提示。@HerthaBSCfan
files
是一个提供文件名列表的程序。@roganjosh:(我的程序现在还没有结束。没有池,它会运行20分钟。有了池,它已经运行了一个小时,并且还在运行。。。