2012-08-08 130 views
2

我所做的工作涉及到從SQL服務器數據庫中下載大量數據。爲此,我們使用SqlDataReader加載自定義數據集定義,然後遍歷Datatable並將每行構建到一個對象中,然後通常將這些對象打包爲一個大型字典。自定義通用IEnumerator綁定到數據庫

我們使用的數據量足夠大,有時無法放入具有內存上限的單個數據表。在極端情況下,字典甚至已經增長到足以超過8 GB的系統內存。我負責修復數據表溢出時引發的內存異常。我通過實現批處理方法來實現這一點,該方法似乎與數據表的使用方式有衝突,但它暫時有效。

我現在的任務是進一步減少這個過程的內存需求。我的想法是創建一個一般類型的繼承自IEnumerator的類,它接受一個SqlDataReader並基本上使用閱讀器作爲它正在枚舉的集合。 MoveNext()函數將推進閱讀器,並且Current屬性將從閱讀器的當前行返回由構建器方法構建的指定類型的對象。

我的問題:這是一個可行的想法?我從來沒有聽說過/無法在網上找到任何喜歡它的東西。

另外,邏輯上:當我調用當前屬性時,如何調用類型聲明要求的特定構建器函數?

我很樂意批評和批評夢想的一個愚蠢的想法。我最想找到實現總體目標的最佳做法。

回答

3

看起來相當明智的,實際上非常簡單使用迭代器塊:

private static IEnumerable<Foo> WrapReader(SqlDataReader reader) 
{ 
    while (reader.Read()) 
    { 
     Foo foo = ...; // TODO: Build a Foo from the reader 
     yield return foo; 
    } 
} 

然後你可以使用它:

using (SqlDataReader reader = ...) 
{ 
    foreach (Foo foo in WrapReader(reader)) 
    { 
     ... 
    } 
} 

如果你細心的話你甚至可以使用LINQ到對象:

using (SqlDataReader reader = ...) 
{ 
    var query = from foo in WrapReader(reader) 
       where foo.Price > 100 
       select foo.Name; 
    // Use the query... 
} 
+0

我想我應該在你的書中讀到第6章... :) – Jared275 2012-08-08 15:57:51

+0

@ Jared275:Soun ds對我很好:) – 2012-08-08 15:58:35

相關問題