2013-12-11 30 views
0

如果從調用executequery()返回大量記錄(例如,超過625,000條記錄),是否會出現System.OutOfMemoryException異常?BreezeJS:通過executequery()檢索大量記錄== System.OutOfMemoryException

使用take()可以正常工作,例如,

var query = breeze.EntityQuery 
    .from("Biography") 
    .select("ENTITY_ID, NAME, NICKNAME") 
    .where("VAL1","==","AL") 
    .orderBy("ENTITY_ID") 
    .take(1000); 

但是,要求所有記錄導致System.OutOfMemoryException錯誤。

var query = breeze.EntityQuery 
    .from("Biography") 
    .select("ENTITY_ID, NAME, NICKNAME") 
    .where("VAL1","==","AL") 
    .orderBy("ENTITY_ID"); 

運行等效SQL大約需要5秒才能成功完成。

+0

你的問題是? – Ward

+0

當遇到System.OutOfMemoryException時,是結合使用skip()和take()的多個查詢結果的最佳解決方案嗎? – user3071284

回答

1

我並不感到驚訝。

爲了清楚起見,您正試圖將超過625,000條記錄移動到電線上,然後創建實體。服務器上的查詢可能非常快,但是這些記錄中的每一個都需要序列化爲json,通過網絡發送,然後重組爲一個實體。即使是最好的實現,這些操作既耗時又耗費大量數據。

因此,您有幾個選項可以減少內存佔用量和操作時間。

  1. 使用取值(按你的例子​​)
  2. 使用EntityQuery.noTracking選項。這會跳過將序列化記錄轉換爲「真實」實體的步驟。如果您以後需要「真實」實體,則可以根據需要選擇性地將它們添加到EntityManager。
+0

我組合了這兩個選項,並在查詢變量賦值的末尾加上以下內容:take(500000).noTracking();這可以工作,但是在相同的內存不足例外情況下會出現超過500000個結果。我想我會嘗試多次查詢,使用skip()和take(),每次向數組添加記錄 - 除非有另一種方式。任何想法可能會更好? – user3071284