이것이 나의 첫 번째 멀티 프로세싱 구현이다. 나는 순차적 인 접근 방식으로 코드를 실행했고 20 초 정도의 레코드를 처리하는 데 30 초 정도 걸린다. 하지만 각 키가 레코드 집합을 가진 사전을 만들고 모든 키에 대해 pool.map을 사용하여 함수를 적용하려고했습니다. 이제는 각 프로세스마다 각 코어를 할당하지만 2 분 이상 처리 할 수 있습니다. 누군가 나를 최적화하도록 도울 수 있습니까?파이썬 - 멀티 프로세싱은 순차적 인 것보다 느리다
def f(values):
data1 = itertools.combinations(values,2)
tuple_attr =('Age', 'Workclass', 'Fnlwgt', 'Education', 'Education-num', 'marital-status', 'Occupation', 'Relationship', 'Race', 'Sex', 'Capital-gain', 'Capital-loss', 'Hours-per-week', 'Native country', 'Probability', 'Id')
new = ((tuple_attr[i] for i, t in enumerate(zip(*pair)) if t[0]!=t[1]) for pair in data1)
skt = set(frozenset(temp) for temp in new)
newset = set(s for s in skt if not any(p < s for p in skt))
empty = frozenset(" ")
tr_x = set(frozenset(i) for i in empty)
tr = set(frozenset(i) for i in empty)
for e in newset:
tr.clear()
tr = tr.union(tr_x)
tr_x.clear()
for x in tr:
for a in e:
if x == empty:
tmp = frozenset(frozenset([a]))
tr_x = tr_x.union([tmp])
else :
tmp = frozenset(frozenset([a]).union(x))
tr_x = tr_x.union([tmp])
tr.clear()
tr = tr.union(tr_x)
tr = set(l for l in tr if not any(m < l for m in tr))
return tr
def main():
p = Pool(len(data)) #number of processes = number of CPUs
keys, values= zip(*data.items()) #ordered keys and values
processed_values= p.map(f, values)
result= dict(zip(keys, processed_values))
p.close() # no more tasks
p.join() # wrap up current tasks
print(result)
if __name__ == '__main__':
import csv
dicchunk = {*****} #my dictionary
main()
큰 데이터 세트로 시도해보십시오. 다중 쓰레드/프로세스가 문맥 전환, 포킹 등의 오버 헤드에 걸리기 전에 꽤 많은 작업이 필요합니다. –
이것은 하나의 지저분한 코드입니다. 실제로는 변수 이름을 사용해야합니다. @ 코리가 내 의견을 타이핑 할 때 - 큰 데이터 세트를 말할 때. 그러나 너무 비싸지는 않을 것이기 때문에 기억이 아주 비쌀 것입니다. –
샘플 데이터 세트를 제공 할 수 있습니까? – dano