我有一个巨大的字典,其中numpy数组作为值,几乎消耗了所有的RAM。不可能完全腌制或压缩。我已经检查了solutions的some以使用zlib
进行块读/写,但是当我想从RAM读/写时,它们处理的是文件,StringIO
等等。在
Here is the closest example to what I want,但它只有写入部分。我怎样才能在保存后读取对象,因为块是一起写的,而压缩的块当然有不同的长度?在
import zlib
class ZlibWrapper():
# chunksize is used to save memory, otherwise huge object will be copied
def __init__(self, filename, chunksize=268435456): # 256 MB
self.filename = filename
self.chunksize = chunksize
def save(self, data):
"""Saves a compressed object to disk
"""
mdata = memoryview(data)
with open(self.filename, 'wb') as f:
for i in range(0, len(mdata), self.chunksize):
mychunk = zlib.compress(bytes(mdata[i:i+self.chunksize]))
f.write(mychunk)
def load(self):
# ???
return data
不幸的是,未压缩的对象太大,无法通过网络发送,而将它们压缩到外部会造成额外的复杂性。在
Pickle不幸地开始消耗RAM和系统挂起。在
在与Charles Duffy讨论之后,我尝试序列化(目前不起作用-甚至不压缩字符串):
^{pr2}$
您的第一个重点应该是有一种合理的方法来序列化和反序列化您的数据。我们对问题本身或评论中提供的数据有几个限制:
这意味着一个相当简单的实现:
作为一个简单的测试:
^{pr2}$…那么,我们现在就知道了,如何添加压缩?很容易。在
…或者,在减压方面:
这是因为
gzip
库已经按请求流式输出数据,而不是一次压缩或解压所有数据。不需要自己进行窗口和分块,只需将其放在较低的层即可。在要将字典写入磁盘,zipfile模块非常适合。在
相关问题 更多 >
编程相关推荐