2016-08-01 47 views
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 

回答

1

你必須保證你的代碼,你只是傳遞一個單一功能map;它不夠聰明,知道你希望它通過wordlist到你的函數的第二個參數。

TBH部分功能的應用是在Python有點笨重,但你可以使用functools.partial

from functools import partial 
p.map(partial(wordify, wordlist), chunked) 
+0

首先解決給我: 'cPickle.PicklingError:不能鹹菜<類型 '功能'>:屬性。查找__builtin __功能failed' 解決方案二的作品,但它比做得單線程慢: '單線程:0.423000097275','多線程:0.605999946594' – doc

+0

你不應該指望提升速度,除非正在進行的工作是巨大的。按第一個逗號分割一行是很困難的工作,而且僅僅通過進程間管道來回傳送字符串幾乎肯定會花費更多的時間。後者並不是真的很昂貴,而是更多的是你用琴絃做的東西非常便宜。 –

+0

這樣做的數據量將大幅增加。有沒有更有效的方法來做到這一點,因爲我絕對沒有看到需要在進程間發送字符串而修改子列表。只有在重新加入子列表時才應該來回發送東西。 – doc

相關問題