簡體   English   中英

GAE Objectify規模龐大? 進口

[英]GAE Objectify massive? import

我需要將大約1,000,000條記錄導入到數據存儲區。 而且,我想將其中一些記錄合並為一個記錄。 到目前為止,我嘗試過的一切都將花費很長時間,並且如果后端中途終止任務以在另一台計算機上重新啟動該任務,那我將無法恢復。

我的第一次嘗試是在每次插入之前查詢數據存儲,以將數據添加到現有匹配記錄中,否則插入新記錄。

Crops local = // read from CSV
for (...)
{
  Crops db = ObjectifyService.ofy().load().type(Crops.class).
    id(local.country + "_" + local.cropType + "_" + 
    new Integer(local.year).toString()).now();

  if (db == null)
  {
    db = local;
    crops.put(composite, db);
  }
  else
  {
    // add additional data to db
  }
  ObjectifyService.ofy().save().entity(db).now();
}

估計完成此過程需要13個小時。

所以我試圖在本地匯總數據

Crops local = // read from CSV
HashMap<String, Crops> crops = ...
for (...)
{
  String composite = local.country + "_" + local.cropType + "_" + 
    new Integer(local.year).toString();
  Crops db = crops.get(composite);

  if (db == null)
  {
    db = local;
    crops.put(composite, db);
  }
  else
  {
    // add additional data to db
  }
}
ObjectifyService.ofy().save().entities(crops.values()).now();

由於堆太大,導致程序終止。

我要工作的一個變體是將聚合數據分成1000條記錄的大塊用於存儲它們。

Iterator<Crops> sit = crops.values().iterator();
List<Crops> list = new ArrayList<Crops>(1000);
i = 0;
while (sit.hasNext())
{      
  list.add(sit.next());
  i++;
  if (i >= 1000)
  {
    ObjectifyService.ofy().save().entities(list).now();
    list.clear();
    i = 0;
  }
}
ObjectifyService.ofy().save().entities(list).now();

但是完成此操作所需的估計時間為80小時。

我想嘗試的下一件事是並行插入這些1000個塊,而不是順序插入。

但是在我浪費更多時間之前,我想問一下我是在正確的道路上還是在做錯一切。 也許在13小時之內不可能獲得這樣的進口?

tl; dr

將大型數據集導入數據存儲區的最快方法是什么?

  1. 看看MapReduce-它是專為可拆分成較小塊的大量工作而設計的。

  2. 無需檢查實體是否已存在,除非該實體中有一些數據被覆蓋后會丟失。 如果可以安全地覆蓋它,只需插入您的實體。 這將使您的時間減少一半或更多。

  3. 批處理數據庫調用將大大加快速度。

  4. 我不知道local.year是什么類型,但是如果它是int ,則可以簡單地執行以下操作:

     String composite = local.country + "_" + local.cropType + "_" + local.year; 

暫無
暫無

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

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