2009-04-28 107 views
2

假設我在MSSQL數據庫中有幾個表,每個表都有大約5-10個屬性。表格之間有一些簡單的關聯,但每個表格都有500,000到1,000,000行。Linq to SQL vs序列化

有一個算法運行在該數據上(所有它),所以在運行該算法之前,我必須從數據庫中檢索所有數據。該算法不改變數據,只讀取它,所以我只需要檢索數據。

我正在使用LINQ to SQL。檢索所有數據大約需要兩分鐘。我想知道的是序列化到文件然後反序列化(如果需要的話)實際上會更快地加載數據。

數據大概是200MB,我不介意將它保存到磁盤。那麼,如果從文件中反序列化對象或使用LINQ 2 SQL DataContext,會更快嗎?

有關於此的任何經驗?

回答

2

我認爲LINQtoSQL可能不是這種應用程序的最佳選擇。當你談論這麼多的對象時,你需要花費很多開銷創建對象實例(持久化類)。

我會選擇一個解決方案,其中存儲過程通過ADO.NET只檢索必要的數據,應用程序將其存儲在內存中(內存現在便宜,200MB應該不成問題),分析算法運行在內存中的數據。

我不認爲你應該將數據存儲在文件中。最後,數據庫也只是一個或多個由數據庫引擎讀取的文件。所以,你要麼

  • 讓數據庫引擎讀取你的數據,你分析它,或
  • 讓數據庫引擎讀取你的數據,你把它寫到文件,你讀的文件(再次讀取相同的數據,但現在你自己做),你分析的數據

後者的選擇涉及很多沒有任何優勢的開銷,據我所知。

編輯:如果你的數據變化非常頻繁,你可以考慮分析和緩存某處經過預處理的數據(數據庫或文件系統)之前預處理數據。這隻有在您的預處理數據可以比原始數據更快地分析(很多)時纔有意義。也許一些預處理可以在數據庫本身完成。

+0

第二種方法沒有意義,但我一直在考慮從數據庫加載一次,然後一次保存到文件。然後,而不是每次程序啓動時從數據庫加載,從文件加載。所以差異更像是從db加載與從文件加載。 似乎無論如何LINQtoSQL對象都是默認可序列化的,所以我想這是很多工作和部分類來使它們可序列化的。 – 2009-04-28 15:52:35

+0

那麼它更像是一個緩存解決方案呢?數據變化很少,所以你可以讀一遍並存儲一段較長的時間,而不用擔心變化?然後,您可以通過將應用程序更容易地分析的格式緩存,從而獲得一些性能。我在回答中增加了一些建議。 – 2009-04-28 18:13:48

2

您應該嘗試直接使用ADO.NET,而不使用LINQ to SQL層,即使用SqlDataReader來讀取數據。

如果您按順序處理數據,您可以在需要時從讀取器獲取記錄,而無需先將它們全部讀入存儲器。

0

如果你有一個數據庫上大部分的數據進行操作的過程......那麼這聽起來像一個存儲過程的工作。這不會是面向對象的,但是這將是一個很大更快,更脆。

0

既然你是在C#這樣做的,你的數據庫是MSSQL(因爲你使用LINQ到SQL),你能不能在管理存儲過程運行您的代碼?這將讓你保持你當前的代碼,因爲它是,但因爲代碼是在SQL Server運行加載數據會更快。