我有以下問題:我使用谷歌數據存儲來存儲兩種,公司和申請人,他們都來自不同的數據源,所以沒有辦法對他們直接鏈接(沒有共同的ID)。匹配實體與谷歌AppEngine上的MapReduce
我所試圖實現的是,以這兩種實體的名比較(做一些歸一化後),這些保存爲類型匹配的新實體。
爲此,我在appengine上創建了一個通過所有申請人(〜1M個實體)的MapReduce作業,併爲每個實體查詢具有相同名稱的公司(總共約10M個實體),但該過程非常緩慢,我正在以下吞吐量:
映射器,電話:691411(9.27 /秒平均)
映射-walltime-MS:(23108.41 /秒平均)1724026200
牆時間似乎對我位太高,但我不確定它是什麼意思,我正在運行32個碎片,代碼如下:
def match_map(applicant):
if(applicant.applicant_name_normalised != ""):
# Check against the companies
cps = Company.query(Company.name_normalised == applicant.applicant_name_normalised).fetch(projection=[Company.dissolved])
if(len(cps) > 0):
is_potential = True
else:
return
m = Match(id=applicant.key.id())
idList = []
for c in cps:
idList.append(c.key)
if(c.dissolved != True):
is_potential = False
m.companies = idList
m.applicant = applicant.key
m.is_potential = is_potential
if(is_potential):
yield op.db.Put(m)
idList[:] = []
我該如何執行此操作才能運行得更快?我幾乎要離開谷歌數據存儲,並在另一個數據庫或使用腳本這樣做,我知道查詢可能是昂貴的,但10實體/秒只是低於我的期望。
感謝
嗨@ozarov,所以我們基本上試圖在破產的公司和某種產品的買家之間進行匹配,這個過程是每月運行一次,每次都會包含與上次相同的舊的一個月加上幾千新的,據我所知他們不會很快翻倍。 我的確在考慮將此位遷移到內存DB中的Redis或其他內存,或者可能是MySql來執行此匹配,然後將感興趣的屬性寫回數據存儲。 – Clds
我會嘗試你明天提出的建議,mapper作業已經運行了一天以上,所以我真的不想插入bug並停止執行。 – Clds
由於ozarov,吞吐量乘以10!但是我發現我可以在幾秒鐘內使用BigQuery來做同樣的事情,所以我可能會在下一次使用它 – Clds