def build(cls, initializer, destfile = None, tempdir = None, idmap = None,
value_array_kwargs = {},
id_mapper_kwargs = {}):
if destfile is None:
destfile = tempfile.NamedTemporaryFile(dir = tempdir)
# Must dump values and keys to temporary files because
# we don't know the size of the idmap before building it,
# and it has to be at the beginning of the file
with tempfile.NamedTemporaryFile(dir = tempdir, suffix = '.v',) as values_file:
with tempfile.NamedTemporaryFile(dir = tempdir, suffix = '.k') as keys_file:
initial_pos = destfile.tell()
value_array = cls.ValueArray.build(
_iter_values_dump_keys(initializer, keys_file), values_file,
tempdir = tempdir, idmap = idmap, **value_array_kwargs)
id_mapper = cls.IdMapper.build(
_iter_key_dump(keys_file), destfile,
tempdir = tempdir, **id_mapper_kwargs)
# pad to multiple of 32 for better cache alignment
pos = destfile.tell()
if pos & 31:
destfile.write("\x00" * (32 - (pos & 31)))
values_pos = destfile.tell()
blocklen = 1 << 20
for start in xrange(0, len(value_array.buf), blocklen):
destfile.write(buffer(value_array.buf, start, blocklen))
destfile.write(cls._Footer.pack(values_pos - initial_pos))
destfile.flush()
return cls(value_array, id_mapper)
评论列表
文章目录