def __init__(self, init_dict=None):
"""Create a shared memory version of each element of the initial
dictionary. Creates an empty array otherwise, which will extend
automatically when keys are added.
Each different type (all supported types listed in the ``types`` array
above) has its own array. For each key we store an index into the
appropriate array as well as the type of value stored for that key.
"""
# idx is dict of {key: (array_idx, value_type)}
self.idx = {}
# arrays is dict of {value_type: array_of_ctype}
self.arrays = {}
self.tensors = {}
if init_dict:
sizes = {typ: 0 for typ in self.types.keys()}
for k, v in init_dict.items():
if 'Tensor' in str(type(v)):
# add tensor to tensor dict--don't try to put in rawarray
self.tensors[k] = v
continue
elif type(v) not in sizes:
raise TypeError('SharedTable does not support values of ' +
'type ' + str(type(v)))
sizes[type(v)] += 1
# pop tensors from init_dict
for k in self.tensors.keys():
init_dict.pop(k)
# create raw arrays for each type
for typ, sz in sizes.items():
self.arrays[typ] = RawArray(self.types[typ], sz)
# track indices for each key, assign them to their typed rawarray
idxs = {typ: 0 for typ in self.types.keys()}
for k, v in init_dict.items():
val_type = type(v)
self.idx[k] = (idxs[val_type], val_type)
if val_type == str:
v = sys.intern(v)
self.arrays[val_type][idxs[val_type]] = v
idxs[val_type] += 1
# initialize any needed empty arrays
for typ, ctyp in self.types.items():
if typ not in self.arrays:
self.arrays[typ] = RawArray(ctyp, 0)
self.lock = Lock()
评论列表
文章目录