簡體   English   中英

讀取腌制數據時出現EOFError

[英]EOFError when reading pickled data

我正在嘗試釋放存儲在Google App Engine內存緩存中的網頁的內容。 首先,我得到塊並將其存儲為帶有密鑰的字典

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。 最初腌制數據的代碼是:

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的首頁加載到內存緩存中,所以我認為它不會超出此限制。

您想連接字符串,而不是連接。

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())])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM