2010-03-26 82 views
9

我正在處理一個相當大的mysql數據庫(數百萬行)和一列存儲blob圖像。應用程序嘗試獲取圖像的一個子集並在其上運行一些處理算法。我遇到的問題是,由於我有相當大的數據集,查詢返回的數據集太大而無法存儲在內存中。處理巨大的SQL結果集

目前,我已將查詢更改爲不返回圖像。在迭代結果集的同時,我運行另一個選擇來抓取與當前記錄相關的單個圖像。這很有效,但成千上萬的額外查詢導致性能下降,這是不可接受的。

我的下一個想法是將原始查詢限制爲10,000個結果左右,然後繼續查詢10,000行的跨度。這似乎是兩種方法之間道路妥協的中間。我覺得可能有更好的解決方案,我不知道。有沒有另一種方法可以同時在內存中只有部分巨大的結果集?

乾杯,

戴夫·麥克萊蘭

+0

也許我的記憶問題不是由查詢造成的。我回到了舊版本(感謝,版本控制),並且數據讀取器似乎只加載它正在閱讀的行,正如Anthony所述。 不過,我不知道將圖像保留在本地文件系統上而不是通過數據庫服務器通過網絡傳輸它們是否更有意義(如下面的ProphetBeal所述)。缺點是它將被存儲在兩個位置(它們必須保留在數據庫中供其他系統使用),但文件系統存儲空間並不是一個直接的問題。 對此有何想法? – 2010-03-26 17:14:48

+0

我給安東尼的答案是因爲他指出DataReader不是我的記憶被填滿的原因(這是相關的,但略有不同)。我很可能會使用ProphetBeal的解決方案來保持本地計算機上的BLOB以消除網絡擁塞,但對於任何處理大型數據集以存儲本地計算機的人來說,DataReader應該是一個有效的解決方案。 – 2010-03-28 22:45:20

回答

3

一種選擇是使用DataReader。它對數據進行流式處理,但是以保持與數據庫的開放連接爲代價。如果您迭代數百萬行併爲每個行執行處理,那可能不合意。

我認爲你正在朝着正確的方式抓取塊中的數據,可能使用MySql的Limit方法,對嗎?

+0

是的,我曾計劃使用SQL的限制。 – 2010-03-26 00:19:30

+0

此外,我已經使用DataReader來存儲結果(使用OdbcCommand.ExecuteReader(),然後迭代while(datareader.Read())。它似乎不是非常有效的流,因爲它仍然填滿所有可用的系統內存。有沒有使用我不知道的數據採集器? – 2010-03-26 00:54:45

+0

@Dave,其他人可能能夠提供關於數據採集器特定內存使用情況的信息,但我的理解是,它應該只有一條記錄無論如何,它應該比DataSet或DataTable需要少得多的內存資源,你的內存問題可能是你在檢索數據後對數據做了什麼的結果,你是多久保持這些對象的範圍等。 – 2010-03-26 01:25:51

1

當這樣的大型數據集處理重要的是不要需要擁有一切在內存中一次。如果您將結果寫入磁盤或網頁,請在讀取每行時執行此操作。在開始寫作之前,不要等到你讀完所有的行。

您也可以將圖像設置爲DelayLoad = true,以便只在需要時才抓取它們,而不是自己實現此功能。有關更多信息,請參閱here

+0

我應該提到,我(當前)使用ADO.NET。有沒有相當於DelayLoad?我可以遷移到Linq,但不喜歡。我會更新問題標籤。 另外,我不會在任何地方寫結果。我正在對結果運行一些圖像分析算法,以將其與傳遞給函數的圖像進行比較。因此,我只需要存儲最好的圖像,並可以忽略其餘部分。 感謝您的快速回復! – 2010-03-26 00:10:55

0

我看到2個選項。如果這是一個Windows應用程序(而不是一個Web應用程序),您可以使用數據讀取器讀取每個圖像並將該文件轉儲到磁盤上的臨時文件夾,然後您可以執行任何所需的處理針對物理文件。

2)以小塊讀取和處理數據。根據圖像的大小以及您想要做多少處理,10k行仍然很多。一次返回5千行的行數,並在剩餘的1k剩餘時間內在單獨的線程中讀取更多數據可以實現無縫過程。

此外,雖然並不總是推薦,但在處理之前強制垃圾回收,下一組行可以幫助釋放內存。

0

我用像一個之前本教程中列出的解決方案: http://www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/data-access/tutorial-25-cs.aspx

你可以使用多線程的預拉未來幾年的數據集的一部分(第一拉1-10,000和背景拉10,001 - 20,000和20,001 - 30,000行;刪除前面的數據頁面(比如,如果你是50,000到60,000,刪除前1-10,000行以節省內存,如果這是個問題)。將當前「頁面」的位置作爲指向下一個數據範圍的指針或刪除一些超出範圍的數據。