2014-03-07 49 views
5

我想對象添加到IndexedDB的一些表中的一個交易:優化的批量(組塊)物件上傳到IndexedDB的

_that.bulkSet = function(data, key) { 
    var transaction = _db.transaction([_tblName], "readwrite"), 
     store = transaction.objectStore(_tblName), 
     ii = 0; 

    _bulkKWVals.push(data); 
    _bulkKWKeys.push(key); 

    if (_bulkKWVals.length == 3000) { 
     insertNext(); 
    } 

    function insertNext() { 
     if (ii < _bulkKWVals.length) { 
      store.add(_bulkKWVals[ii], _bulkKWKeys[ii]).onsuccess = insertNext; 
      ++ii; 
     } else { 
      console.log(_bulkKWVals.length); 
     } 
    } 
}; 

看起來,它工作正常,但它是不是很優化做的方式特別是如果對象的數量非常高(〜50.000-500.000)。我怎麼可能優化它?理想情況下,我想添加第一個3000,然後從陣列中刪除它,然後添加另一個3000,即分塊。有任何想法嗎?

回答

14

連續插入多行,不可能獲得良好的性能。

我是IndexedDB dev並且在您所談論的規模(連續編寫數十萬行)中擁有IndexedDB的實際經驗。它不太漂亮。

在我看來,IDB並不適合用於需要連續寫入大量數據的情況。如果我要構建一個需要大量數據的IndexedDB應用程序,我會想出一種方法來慢慢播種它。

問題在於寫入,而我所看到的問題是寫入緩慢,加上其I/O密集性質,隨着時間的推移會變得更糟。 (IDB的閱讀速度一直很快,因爲它值得。)

首先,您將從重新使用交易中節省開支。因爲你的第一本能可能是試圖將所有東西塞進同一個事務中。但是,從我在Chrome中發現的情況來看,例如,瀏覽器似乎不喜歡長時間運行的寫入,這可能是因爲某種機制旨在遏制行爲不當標籤。

我不確定你看到了什麼樣的表現,但根據測試的大小,平均數可能會欺騙你。限制速度更快是吞吐量,但是如果您試圖連續插入大量數據,請特別注意隨時寫入。

我碰巧正在處理一個有數十萬行的演示程序,並擁有統計信息。在禁用了可視化功能的情況下,在IDB上運行純破折號,這就是我在單個對象存儲中的Chrome 32中看到的內容,它帶有一個具有自動遞增主鍵的非唯一索引。我看到一個更小的27k行數據集,我看到每秒60-70個條目:
*〜30秒:平均每秒921個條目(在開始時總是有大量插入),62 /第二個在我抽樣
*〜60秒:389 /秒平均值(持續減少開始超過效果初始突發)時71秒/秒
*〜1:30:258 /秒,在時刻67 /秒
*〜2:00(〜1/3完成):平均每秒188個,瞬間66個/秒

一些數據集小得多的例子表現出好得多的表現,但類似的特徵cteristics。同樣大得多的數據集 - 效果非常誇張,我在離開多個小時時看到的每秒只有1個條目。

+1

我也做了一些基準測試,在1000個事務中插入了1000個,並猜測:[創建trasaction +獲取存儲] = 20秒,[inserts] = 10秒...第一個問題嚴重錯誤 – lisak

+0

@buley,你有網站嗎? – MB34