Python - 多处理和文本文件处理
Python - multiprocessing and text file processing
背景:
我有一个巨大的文件 .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 个文本文件,或者不会?我怎样才能让它发挥作用?一旦一个线程结束,分配给它另一个文件文本并开始 运行ning.
编辑:
for filename in os.listdir(pathToFile):
if filename.endswith(".txt"):
for x in range(6):
pool.apply_async(process(filename))
else:
continue
首先,对于 CPU 密集型任务(处理文件是瓶颈)它不会帮助,在这种情况下你应该使用 "real" multiprocessing
.
您描述的问题似乎更适合使用 Pool
的 map 函数之一:
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 个工作进程来处理文件列表和 return 在处理完所有文件后 process()
函数的 return 值的列表。您当前的示例将提交 相同 文件 6 次。
背景:
我有一个巨大的文件 .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 个文本文件,或者不会?我怎样才能让它发挥作用?一旦一个线程结束,分配给它另一个文件文本并开始 运行ning.
编辑:
for filename in os.listdir(pathToFile):
if filename.endswith(".txt"):
for x in range(6):
pool.apply_async(process(filename))
else:
continue
首先,对于 CPU 密集型任务(处理文件是瓶颈)它不会帮助,在这种情况下你应该使用 "real" multiprocessing
.
您描述的问题似乎更适合使用 Pool
的 map 函数之一:
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 个工作进程来处理文件列表和 return 在处理完所有文件后 process()
函数的 return 值的列表。您当前的示例将提交 相同 文件 6 次。