EOF读取腌制数据时出错



我正试图解开存储在谷歌应用引擎内存缓存中的网页块。首先,我获取块,并将它们存储为带有密钥的字典

def get_by_key_name(key_name):
    result = memcache.get_multi(['%s.%s' % (key_name, i) for i in xrange(32)])
    serialized = ''
    for k, v in sorted(result.items()):
        if v is not None:
            serialized = serialized.join(v)
        else:
            return None
    return pickle.loads(serialized) #Line that fails

由于某些原因,它会引发EOFError。最初对数据进行pickle的代码是:

serialized = pickle.dumps(content, 2)
values = {}
for i in xrange(0, len(serialized), chunksize):
  values['%s.%s' % (key_name, i//CHUNKSIZE) ] = serialized[i:i+chunksize]

有人知道为什么吗?顺便说一下,CHUNKSIZE是950000字节。我试图将reddit的首页加载到memcache上,所以我认为它没有超过这个限制。

您想要连接字符串,而不是连接。

serialized += v

Join将在新字符串的每个字符之间添加原始字符串的副本

>>> 'hello'.join('there')
'thellohhelloehellorhelloe'

我对你没有失忆印象深刻!

您错误地加入了字符串:

serialized = ''
for k, v in sorted(result.items()):
    if v is not None:
        serialized = serialized.join(v)

这使用迄今为止构建的selialized作为连接字符串,新字符串被视为单独的字符:

>>> serialized = ''
>>> for v in ('foo', 'bar', 'baz'):
...     serialized = serialized.join(v)
... 
>>> serialized
'bbfooafoorabfooafoorz'

其中'foo'.join('bar')产生'bfooafoor',然后用于连接baz的字符。

构建列表,然后返回:

if None in result.viewvalues():
    # one or more keys came back empty, abort
    return
serialized = ''.join([v for k, v in sorted(result.items())])

最新更新