<p><strong>您的第一个重点应该是有一种合理的方法来序列化和反序列化您的数据。</strong>我们对问题本身或评论中提供的数据有几个限制:</p>
<ul>
<li>您的数据由一个字典组成,其中包含大量的键/值对</li>
<li>所有键都是unicode字符串</li>
<li>所有的值都是numpy数组,它们各自都很短,可以在任何给定的时间方便地放入内存中(甚至可以允许任何单个值的多个副本),尽管<em>总的来说所需的存储空间变得非常大。在</li>
</ul>
<p>这意味着一个相当简单的实现:</p>
<pre><code>def serialize(f, content):
for k,v in content.items():
# write length of key, followed by key as string
k_bstr = k.encode('utf-8')
f.write(struct.pack('L', len(k_bstr)))
f.write(k_bstr)
# write length of value, followed by value in numpy.save format
memfile = io.BytesIO()
numpy.save(memfile, v)
f.write(struct.pack('L', memfile.tell()))
f.write(memfile.getvalue())
def deserialize(f):
retval = {}
while True:
content = f.read(struct.calcsize('L'))
if not content: break
k_len = struct.unpack('L', content)[0]
k_bstr = f.read(k_len)
k = k_bstr.decode('utf-8')
v_len = struct.unpack('L', f.read(struct.calcsize('L')))[0]
v_bytes = io.BytesIO(f.read(v_len))
v = numpy.load(v_bytes)
retval[k] = v
return retval
</code></pre>
<p>作为一个简单的测试:</p>
^{pr2}$
<p>…那么,我们现在就知道了,如何添加压缩?很容易。在</p>
<pre><code>with gzip.open('filename.gz', 'wb') as gzip_file:
serialize(gzip_file, your_data)
</code></pre>
<p>…或者,在减压方面:</p>
<pre><code>with gzip.open('filename.gz', 'rb') as gzip_file:
your_data = deserialize(gzip_file)
</code></pre>
<p><strong>这是因为<code>gzip</code>库已经按请求流式输出数据,而不是一次压缩或解压所有数据。</strong>不需要自己进行窗口和分块,只需将其放在较低的层即可。在</p>