ds_*_*ser 5 python dictionary python-3.x
我正在处理一组frozensets.我试图在字典"输出"中找到每个冻结集的最小集合.我有70k frozensets,所以我正在制作这个冻结字典的大块并且并行化这个任务.当我尝试将此字典作为输入传递给我的函数时,只发送了密钥,因此我收到错误,有人可以帮我找到错误.
output => {frozenset({'rfid', 'zone'}): 0, frozenset({'zone'}): 0, frozenset({'zone', 'time'}): 0}
def reduce(prob,result,output):
print(output)
for k in output.keys():
#Function to do something
def reducer(prob,result,output):
print(output)
p = Pool(4) #number of processes = number of CPUs
func2 = partial(reduce,prob,result)
reduced_values= p.map( func2,output,chunksize=4)
p.close() # no more tasks
p.join() # wrap up current tasks
return reduced_values
if __name__ == '__main__':
final = reducer(prob,result,output)
{frozenset({'rfid', 'zone'}): 0, frozenset({'zone'}): 0, frozenset({'zone', 'time'}): 0}
frozenset({'rfid', 'zone'})
Error : AttributeError: 'frozenset' object has no attribute 'keys'
Run Code Online (Sandbox Code Playgroud)
from multiprocessing import Pool
from functools import partial
import itertools
output = {frozenset({'rfid', 'zone'}): 0, frozenset({'zone'}): 0, frozenset({'zone', 'time'}): 0}
prob = {'3': 0.3, '1': 0.15, '2': 0.5, '4': 0.05}
result = {'2': {frozenset({'time', 'zone'}), frozenset({'time', 'rfid'})}, '3': {frozenset({'time', 'rfid'}), frozenset({'rfid', 'zone'})}}
def reduce(prob,result,output):
print(output)
for k in output.keys():
for ky,values in result.items():
if any(k>=l for l in values):
output[k] += sum((j for i,j in prob.items() if i == ky))
return output
def reducer(prob,result,output):
print(output)
p = Pool(4) #number of processes = number of CPUs
func2 = partial(reduce,prob,result)
reduced_values= p.map( func2,output,chunksize=4)
p.close() # no more tasks
p.join() # wrap up current tasks
return reduced_values
if __name__ == '__main__':
final = reducer(prob,result,output)
{frozenset({'zone', 'rfid'}): 0, frozenset({'zone'}): 0, frozenset({'time', 'zone'}): 0}
for k in output.keys():
AttributeError: 'frozenset' object has no attribute 'keys'
frozenset({'zone', 'rfid'})
Run Code Online (Sandbox Code Playgroud)
{frozenset({'zone', 'time'}): 0, frozenset({'zone', 'rfid'}): 0, frozenset({'zone'}): 0}
frozenset({'zone', 'time'})
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "F:\Python34\lib\multiprocessing\pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "F:\Python34\lib\multiprocessing\pool.py", line 44, in mapstar
return list(map(*args))
File "C:\Users\Dell\workspace\key_mining\src\variable.py", line 16, in reduce
for k in output.keys():
AttributeError: 'frozenset' object has no attribute 'keys'
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\***\variable.py", line 33, in <module>
final = reducer(prob,result,output)
File "C:\***\variable.py", line 27, in reducer
reduced_values= p.map( func2,output,chunksize=4)
File "F:\Python34\lib\multiprocessing\pool.py", line 260, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "F:\Python34\lib\multiprocessing\pool.py", line 599, in get
raise self._value
AttributeError: 'frozenset' object has no attribute 'keys'
Run Code Online (Sandbox Code Playgroud)
问题是你要传递一个dict对象map.当map超过在项目迭代output,它这样做:
for key in output: # When you iterate over a dictionary, you just get the keys.
func2(key)
Run Code Online (Sandbox Code Playgroud)
因此,每次func2调用时,包含的所有内容output都是frozenset字典中的单个键(a ).
根据您上面的评论,您似乎想要传递整个字典func2,但如果您这样做,那么您根本就没有做任何事情.我想也许你认为这样做
pool.map(func2, output, chunksize=4)
Run Code Online (Sandbox Code Playgroud)
将导致output字典被拆分为四个字典,每个字典都被传递给一个实例func2.但那根本不会发生什么.相反,字典中的每个键都是单独发送的func2.
chunksize用于告诉每次通过进程间通信发送到每个子进程的pool元素数量output.它仅用于内部目的; 无论chunksize你使用什么,func2都只会用一个元素来调用output.
如果你想实际传递dict的块,你需要做这样的事情:
# Break the output dict into 4 lists of (key, value) pairs
items = list(output.items())
chunksize = 4
chunks = [items[i:i + chunksize ] for i in range(0, len(items), chunksize)]
reduced_values= p.map(func2, chunks)
Run Code Online (Sandbox Code Playgroud)
这会将一个(key, value)元组列表从outputdict传递给func2.然后,在里面func2,你可以将列表变回dict:
def reduce(prob,result,output):
output = dict(item for item in output) # Convert back to a dict
print(output)
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8056 次 |
| 最近记录: |