0
我有一個字符串列表和每個字符串,我正在做一些更改,您可以在wordify()
中看到。現在,爲了加快速度,我使用chunked()
將列表分成子列表(子列表的數量是CPU核心的數量 - 1)。這樣我得到的列表看起來像[[,,],[,,],[,,],[,,]]
。使用映射的多處理
我儘量做到:
我想要做的每一個上同時這些子表wordify()
,返回子列表作爲單獨的列表。我想等到所有過程完成,然後將這些子列表加入到一個列表中。下面的方法不起作用。
import multiprocessing
from multiprocessing import Pool
from contextlib import closing
def readFiles():
words = []
with open("somefile.txt") as f:
w = f.readlines()
words = words + w
return words
def chunked(words, num_cpu):
avg = len(words)/float(num_cpu)
out = []
last = 0.0
while last < len(words):
out.append(words[int(last):int(last + avg)])
last += avg
return out
def wordify(chunk,wl):
wl.append([chunk[word].split(",", 1)[0] for word in range(len(chunk))])
return wl
if __name__ == '__main__':
num_cpu = multiprocessing.cpu_count() - 1
words = readFiles()
chunked = chunked(words, num_cpu)
wordlist = []
wordify(words, wordlist) # works
with closing(Pool(processes = num_cpu)) as p:
p.map(wordify, chunked, wordlist) # fails
首先解決給我: 'cPickle.PicklingError:不能鹹菜<類型 '功能'>:屬性。查找__builtin __功能failed' 解決方案二的作品,但它比做得單線程慢: '單線程:0.423000097275','多線程:0.605999946594' – doc
你不應該指望提升速度,除非正在進行的工作是巨大的。按第一個逗號分割一行是很困難的工作,而且僅僅通過進程間管道來回傳送字符串幾乎肯定會花費更多的時間。後者並不是真的很昂貴,而是更多的是你用琴絃做的東西非常便宜。 –
這樣做的數據量將大幅增加。有沒有更有效的方法來做到這一點,因爲我絕對沒有看到需要在進程間發送字符串而修改子列表。只有在重新加入子列表時才應該來回發送東西。 – doc