Re: [問題] 處理資料庫時系統錯誤

看板C_Sharp (C#)作者 (A Joke From God)時間19年前 (2006/09/12 20:09), 編輯推噓4(403)
留言7則, 3人參與, 最新討論串3/3 (看更多)
※ 引述《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

09/12 21:40, , 1F
希望你的loop裏沒有new啥物件,詳細的語法貼出來比較穩
09/12 21:40, 1F

09/12 21:41, , 2F
另外若是ADO.Net 1.1的話,DataTable存放大資料有致命效能低
09/12 21:41, 2F

09/13 08:22, , 3F
您要不要試試把跑程式的電腦和SQL切開?
09/13 08:22, 3F

09/13 08:22, , 4F
再不然把整段程式碼移殖到.net 2.0上面
09/13 08:22, 4F

09/13 09:10, , 5F
謝謝各位大大的指導,我後來對資料庫的第一欄位建立索引
09/13 09:10, 5F

09/13 09:11, , 6F
然後程式碼改用一次query十個項目出來計算
09/13 09:11, 6F

09/13 09:11, , 7F
記憶體使用量就大大減少了,謝謝您們! :)
09/13 09:11, 7F
文章代碼(AID): #151gDivJ (C_Sharp)
文章代碼(AID): #151gDivJ (C_Sharp)