作者blue (A Joke From God)
看板C_Sharp
標題Re: [問題] 處理資料庫時系統錯誤
時間Tue Sep 12 20:41:21 2006
※ 引述《sunflier (叮噹)》之銘言:
: ※ 引述《blue (A Joke From God)》之銘言:
: : 但在DataAdapter要fill dataset的時候,
: 因為dataset是屬於offline操作
: 在資料抓取時,會將所有資料先抓到你的memory裡面
: 所以你的記憶體才會爆增
: 你可以用DataReader,用online方式來去操作資料
: 就不會讓你的記憶體爆掉
: (取而代之的是,抓回來的資料是唯讀且為sequential operation
: 不能隨機存取某個row)
: 建議可看一下ADO.NET架構
請問sunflier大大,我如下這樣使用DataReader對嗎?
(connection與command如前文所述)
SqlConnection myConnection = new SqlConnection(connection);
SqlCommand myCommand = new SqlCommand(command, myConnection);
myConnection.Open();
SqlDataReader myReader;
myReader = myCommand.ExecuteReader();
接下來再用while(myReader.Read())將資料一筆筆讀出來計算
但是,問題還是發生了!
myReader = myCommand.ExecuteReader();
這裡一樣跳出了「系統錯誤」的訊息。
剛剛前文忘記仔細交代發生的情況
由於我一次是query 100個項目出來計算(約三萬筆資料)
不論我是用SqlDataAdapter或是SqlDataReader,
查詢第一個一百項目就會讓記憶體使用量到接近1GB,
往往前三四百個項目執行都OK,計算結果有輸出,
不過每一百個項目查詢計算之後,記憶體的使用量就會略往上加
我在每一百個項目查詢結果計算完之後,
前文中我有把myDA, myDS給dispose()掉,
上面使用的myReader跟connection也一樣close()掉
但計算總數不到五百個項目之後還是會出現錯誤訊息
另外,我也試了:一次只查詢一個項目(約三百筆資料),
記憶體使用量也一樣:第一個項目就會直線上升到1GB記憶體使用量,然後慢慢增加!
另外,實際上我如果在SQL Query Analyzer上面查詢一個項目的話,
select * from T1 where Name = 'A1'
記憶體使用量也試一樣的,請問會是我database設定上的問題嗎?
這個database當初是我從很多csv檔匯入資料來的,
裡頭只有一個table就是T1,也沒有設定索引!不知道是不是這原因?
再次謝謝各位大大的指導!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.37.137
推 tomex:希望你的loop裏沒有new啥物件,詳細的語法貼出來比較穩 09/12 21:40
推 tomex:另外若是ADO.Net 1.1的話,DataTable存放大資料有致命效能低 09/12 21:41
推 sunflier:您要不要試試把跑程式的電腦和SQL切開? 09/13 08:22
→ sunflier:再不然把整段程式碼移殖到.net 2.0上面 09/13 08:22
推 blue:謝謝各位大大的指導,我後來對資料庫的第一欄位建立索引 09/13 09:10
→ blue:然後程式碼改用一次query十個項目出來計算 09/13 09:11
→ blue:記憶體使用量就大大減少了,謝謝您們! :) 09/13 09:11