我已經創建了兩個MapReduce管道用於上傳CSV文件以批量創建類別和產品。每個產品都通過KeyProperty綁定到類別。類別和產品模型是基於ndb.Model構建的,所以根據文檔,我認爲從數據存儲庫中檢索時,它們會自動緩存在Memcache中。ndb使用MapReduce時,模型不會保存在內存緩存中
我已經在服務器上運行這些腳本來上傳30個類別,然後是3000個產品。所有數據按預期的方式出現在數據存儲區中。
但是,它似乎不像產品上傳使用Memcache來獲取類別。當我檢查門戶網站中的Memcache查看器時,它說明了命中計數大約爲180,並且計數錯誤數在60左右。如果我每次上傳3000個產品並檢索該類別,應該不會有大約3000個命中+錯過獲取類別(即Category.get_by_id(category_id))?在創建新的產品(算法可處理實體創建和更新)之前,嘗試檢索現有產品可能還會有3000多次。
這裏的相關產品映射功能,這需要從CSV文件中的行以創建或更新產品:
def product_bulk_import_map(data):
"""Product Bulk Import map function."""
result = {"status" : "CREATED"}
product_data = data
try:
# parse input parameter tuple
byteoffset, line_data = data
# parse base product data
product_data = [x for x in csv.reader([line_data])][0]
(p_id, c_id, p_type, p_description) = product_data
# process category
category = Category.get_by_id(c_id)
if category is None:
raise Exception(product_import_error_messages["category"] % c_id)
# store in datastore
product = Product.get_by_id(p_id)
if product is not None:
result["status"] = "UPDATED"
product.category = category.key
product.product_type = p_type
product.description = p_description
else:
product = Product(
id = p_id,
category = category.key,
product_type = p_type,
description = p_description
)
product.put()
result["entity"] = product.to_dict()
except Exception as e:
# catch any exceptions, and note failure in output
result["status"] = "FAILED"
result["entity"] = str(e)
# return results
yield (str(product_data), result)
您能否提供有關如何在memcache中存儲/獲取數據的信息?你使用什麼鍵?請記住,memcache不接受按鍵中的特殊符號(如空格)。 – 2014-10-07 12:52:44
獲取通過.get_by_id()完成,並且通過.put()完成存儲。 類別ID是簡單的字符串(「書籍」,「電影」等)。產品ID目前只是數字(1,2,3 ...),但在發佈之前,我們可能會將其更改爲類別和數字(book_1,book_2,movie_1等)的組合。如果我需要改變,我可以,我只是想要一些相當簡單的東西,這將允許我們使用CSV導入來添加新條目並修改已過期信息或打字錯誤的舊條目。 –
2014-10-07 12:59:51
我認爲這可能是由於內部導致的,上下文緩存,在memcache之前使用。您可以嘗試禁用它以查看是否看到大量的內存緩存命中。當然,上下文緩存比memcache效率更高 – 2014-10-08 06:13:11