[英]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小時之內不可能獲得這樣的進口?
將大型數據集導入數據存儲區的最快方法是什么?
看看MapReduce-它是專為可拆分成較小塊的大量工作而設計的。
無需檢查實體是否已存在,除非該實體中有一些數據被覆蓋后會丟失。 如果可以安全地覆蓋它,只需插入您的實體。 這將使您的時間減少一半或更多。
批處理數據庫調用將大大加快速度。
我不知道local.year是什么類型,但是如果它是int
,則可以簡單地執行以下操作:
String composite = local.country + "_" + local.cropType + "_" + local.year;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.