0

我有以下問題:我使用谷歌數據存儲來存儲兩種,公司申請人,他們都來自不同的數據源,所以沒有辦法對他們直接鏈接(沒有共同的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實體/秒只是低於我的期望。

感謝

回答

1

我能想到輕微的提示,可以優化你做什麼,如:!

而是獲取所有的結果,迭代如果c.dissolved保釋快速= TRUE(如開頭is_potential = True,如果c.dissolved!= True,則將其設置爲True)

但是,理解數據模型以及您嘗試實現的內容可能有助於提出更優化的解決方案。一般而言,Cloud Datastore不是 ,設計用於跨種類連接,也許Google Cloud SQL更適合這個問題。

此外,數據增長預期會有所幫助。截至目前爲止,將(10 + 1)百萬條記錄(或投影數據以節省空間)加載到內存中,並且執行內存中連接將會很簡單且可行,但顯然不會縮放。

關於規模,如果每個匹配的公司密鑰的數量大到適合一個實體,那麼您當前的方法可能也存在問題。

+0

嗨@ozarov,所以我們基本上試圖在破產的公司和某種產品的買家之間進行匹配,這個過程是每月運行一次,每次都會包含與上次相同的舊的一個月加上幾千新的,據我所知他們不會很快翻倍。 我的確在考慮將此位遷移到內存DB中的Redis或其他內存,或者可能是MySql來執行此匹配,然後將感興趣的屬性寫回數據存儲。 – Clds

+0

我會嘗試你明天提出的建議,mapper作業已經運行了一天以上,所以我真的不想插入bug並停止執行。 – Clds

+0

由於ozarov,吞吐量乘以10!但是我發現我可以在幾秒鐘內使用BigQuery來做同樣的事情,所以我可能會在下一次使用它 – Clds