2014-09-01 23 views
0

我試圖取消存儲在Google App Engine內存緩存中的網頁塊。首先我得到的大塊,並將它們作爲字典與密鑰閱讀醃製數據時發生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。最初醃製數據的代碼是:

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上,所以我認爲它不會超過這個限制。

+0

在你的酸洗代碼,其中的保證你會得到一個'$ {} KEY_NAME最終.31'?您的加載代碼假定它必須在那裏。如果你說你失敗的地方失敗了,我在想你有沒有向我們展示的代碼。 – 2014-09-02 03:01:59

回答

1

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

serialized += v 

加入將增加新的字符串

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

我有點感動你沒用完的內存中的每個字符之間的原始字符串的副本!

+0

仍然無法正常工作。然而,你是正確的加入() – 2014-09-01 22:44:17

+0

@ twerk_it_606 - 嗯,超過32塊?有些塊過期了嗎?你可以收集33塊,如果你真的得到最後一塊,把它看作溢出(或繼續抓取)。如果有任何中間項目是None,則斷言。最後,您可以對數據進行長度和散列編碼以進行驗證。 – tdelaney 2014-09-01 23:12:37

+0

我已經檢查過,如果任何值是'None',使用'如果v不是None'。另外,我認爲它不超過32個塊,因爲每個塊都是950,000個字節,並且我試圖將reddit.com加載到更小的memcache上。 – 2014-09-01 23:36:54

1

你是正確加入您的字符串:

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

我很困惑,爲什麼'如果v'? v應該是一連串的數據,爲什麼它應該返回'true'? – 2014-09-01 22:55:18

+0

實際上'if v'是多餘的,但任何非空字符串在布爾上下文中都被視爲true。 – 2014-09-01 23:05:52