2011-02-23 66 views
4

我必須從數據庫中提取150K記錄。我正在使用da.Fill(ds,"Query")及其投擲system.outofmemoryexceptionsystem.outofmemoryexception填充DataAdapter時?

Dim daGrid As New SqlDataAdapter(sqlcmd_q) 
daGrid.Fill(dsGrid, "Query") 
daGrid.Dispose() 

我只需要這個數據表。我無法使用XML。因爲我需要將此分配給MSChartControl以顯示ScotterPlot。

有什麼建議嗎?

+2

購買更多內存;) – w69rdy 2011-02-23 14:58:27

+0

以合理的方式聚合數據... – 2011-02-23 15:01:12

+0

這些記錄有多大(以字節爲單位)? – 2011-02-23 15:01:31

回答

7

我要檢查的第一件事是你要返回多少列以及它們的數據類型是什麼。雖然150K記錄很多,但除非每條記錄的長度大約爲13K(在32位計算機上),否則它不應該給你一個OOM異常。這表明你要麼返回比你需要的更多的字段,要麼可能某些字段是非常大的字符串或二進制數據。嘗試減少select語句以僅返回顯示器絕對需要的字段。

如果這不起作用,您可能需要從DataTable移動到自定義數據類型的列表(具有相應字段的類)。

+0

我覺得有點奇怪。在我的情況下,我有一臺64位的128GB內存和1.8T磁盤機器。該表有300萬行,大約800MB。總是有OOM。但是,這在另一臺內存較少(64GB)的機器中不會發生。我不知道這是怎麼回事。 – machinarium 2015-03-26 03:01:01

+0

'或者可能某些字段是非常大的字符串或二進制數據'假設您有100列全部定義爲'VARCHAR(MAX)',但沒有值超過10個字符。與DB列是否都是'VARCHAR(10)'有區別嗎?我會假設沒有。只有單元格中的實際值「非常大」,對嗎? – sab669 2017-06-02 13:51:27

+0

@ sab669正確 - 客戶端上varchar(max)的內存利用率應該(或多或少)實際數據長度,而不是列的大小。 – 2017-06-02 14:41:21

4

您沒有指定查詢。確保它只包含你需要的列。

如果仍然存在問題,可以嘗試切換到64位(如果您的硬件支持它並且有超過2 GB的可用內存)。

如果這不能幫助您減少內存佔用。一個可能的選擇是繪製繪圖而不將所有基礎數​​據存儲在內存中。只需逐個加載數據,計算座標並存儲這些數據而不存儲底層記錄。也許你甚至可以讓查詢做到這一點。

相關問題