并行迭代文档行

时间:2018-05-08 23:23:39

标签: python parallel-processing multiprocessing python-multiprocessing

我有一个名为words的文档,每行都有一个新单词。我想把这些单词中的每一个都变成一个组成字符的列表。我这样做是为了list(x),其中x是单词。

这就是我正在做的,但我想要一种方法来并行化这个:

split = []
with open('wordprob.txt','rt') as lines:
    for line in lines:
        split.append(list(line))

我正在使用这种方法,因此我不必将整个文件(超过3 GB)加载到内存中。通过首先加载文件来并行化,我的内存使用量超过16 GB。

如何在不将文件加载到内存的情况下对其进行并行化,就像上面的循环一样?

谢谢!

编辑:下面指出该列表会占用大量内存。相反,我如何将每个字符列表(最初来自单个单词)存储为新文档的新行上的空格分隔字符串。我再次寻找并行解决方案。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了问题,您有一个文件,例如

sushi
banana
sujuk
strawberry
tomato
pho
ramen
manaqish

并且您希望生成新文件,如下所示:

s u s h i
b a n a n a
s u j u k
s t r a w b e r r y
t o m a t o
p h o
r a m e n
m a n a q i s h

然后你可以编写一个简单的stdin-stdout程序,比如

import sys
for line in sys.stdin:
    sys.stdout.write(' '.join(list(line)))

如果所有数据都转到同一个文件,那么即使你并行化,你的每个线程或进程都会竞争写入同一个输出文件。

如果您真的想要并行化并且想要坚持使用Python,那么您可以使用Hadoop Streaming。你的工作将是一个只有映射器的工作;实际上映射器是上面的三行脚本。但我不确定这会给你带来多少收获,除非你的数据集非常大。转型非常简单,但随时可以分析工作,看看你是否从中受益匪浅。

我认为3GB不是很多,但这在Hadoop(或者孩子们现在使用的任何东西)中都是一个有趣的练习。