線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1317
推到 Plurk!
推到 Facebook!

程式記憶體增加問題?

尚未結案
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-05 17:37:25 IP:210.66.xxx.xxx 未訂閱
請教各位前輩,小弟有一程式需要用ADOQuery來查詢資料,目前用的方法是動態產生ADOQuery,但由於查詢次數很頻繁,再多次查詢後,程式記憶體一直暴增,雖然有把ADOQuery給Free掉,但似乎沒什麼用,到最近才試出把程式縮小後,所佔用的記憶體會被釋放,但也不能讓User一直去做這樣的動作,我有看過站內有釋放記釋體之程式,但我不想讓Client端常駐這樣一個程式,所以想請教各位前輩,是否有什麼指令可以用來釋放記憶體的!謝謝! Ian
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-06 09:18:43 IP:203.95.xxx.xxx 未訂閱
除了動態產生 ADOQuery 外, 其實你也可以用靜態的 ADOQuery, 讓該 ADOQuery 可以重覆使用不用每次都動態生成, 應該可以有效的控控記憶體使用, 另外, 請問你動態生成的 ADOQuery 頻率或次數會很高嗎? 若是都有釋放的話, 除非使用的非常頻繁, 否則應該不會像你說的吃記憶體的狀況那麼嚴重, 大約是多少次呢?
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-06 09:56:20 IP:210.66.xxx.xxx 未訂閱
謝謝Timhuang的答覆,小弟解釋一下狀況,我的程式需要去找CSV檔,將CSV檔做計算: 第一次查詢計算出Max、Min、Avg、Std之值 第二次查詢分了十二次,因為我需要計算到該CSV檔當中十二個欄位之眾數,不知是否有其他更好的方法 第三、四、五次要算出三種良率 所以一個CSV檔做十九次的Query,User有時一次要查詢二、三百筆的的CSV檔出來,再做上面的統計,所以假設有三百筆的CSV檔,我的查詢就要做 300*19=5700次的Query,每一次都把TADOQuery free掉及整個做完再把TADOQuery free掉之方法都試過了,但是程式所佔之記憶體都一直增加,我不知道為什麼會這樣,還是我的方法錯了,有更快的方法可以算出我要的統計值,謝謝! Ian
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-06 10:05:21 IP:211.96.xxx.xxx 未訂閱
你用的是ADOQuery:=TADOQuery.create(self)還是ADOQuery:=TADOQuery.create(nil)? 我的建議是使用create(nil),在這個procedure完成時,做個FreeAndNil(ADOQuery),我跑多thread時都用這種方式,跑了成千上萬次,未見記憶体有什麼耗損~~~~您可以參考看看 我懂的不多,懂的也不盡然是最佳的寫法,但求我懂的東西,能在大家的討論中,愈辯愈明~
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-06 13:40:59 IP:210.66.xxx.xxx 未訂閱
japhenchen兄,我是用 ADOQuery:=TADOQuery.create(nil)及 FreeAndNil(ADOQuery)來做,唉!記憶體還是一直加! 不知是不是我那裡有出錯,我再試試看! 謝謝你的意見! Ian
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-06 17:11:30 IP:211.96.xxx.xxx 未訂閱
試問一下,你是連接什麼資料庫?是直接連接(OLEDB或SQLDRIVER)呢?還是通過BDE或者是ODBC?如果有通過BDE或ODBC的話,請試著改用直接連接來處理看看,我現在不管是用SQL,還是ACCESS的MDB,全都是用OLEDB或SQLDRIVER來處理.. 我懂的不多,懂的也不盡然是最佳的寫法,但求我懂的東西,能在大家的討論中,愈辯愈明~
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-06 18:57:49 IP:210.66.xxx.xxx 未訂閱
我是用Microsoft.Jet.OLEDB.4.0來連接CSV文字檔的,我不太懂你說的用SQLDRIVER來處理,可不可以麻煩你show一個用SQLDRIVER連文字檔的範例呢?我是用ADOConnection來連接的,謝謝你! Ian
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-06 19:15:05 IP:211.96.xxx.xxx 未訂閱
這沒錯啊~你有沒有檢查是不是其他的指標或OBJECT沒FREE掉? 我懂的不多,懂的也不盡然是最佳的寫法,但求我懂的東西,能在大家的討論中,愈辯愈明~
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-07 08:36:59 IP:210.66.xxx.xxx 未訂閱
唉!就是全都Free了才傷腦筋,另外有一個奇怪的狀況是,程式Run的時候,佔的記憶體會一直加大,可是我如果把程式整個最小化,記憶體就被釋放了,但總不能叫User一直最大化、最小化視窗吧!頭痛! Ian
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-11-07 16:34:06 IP:211.96.xxx.xxx 未訂閱
介意把程式貼上來讓大家看看哪里不妥了可以嗎? 我懂的不多,懂的也不盡然是最佳的寫法,但求我懂的東西,能在大家的討論中,愈辯愈明~
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-11-08 12:09:12 IP:203.222.xxx.xxx 未訂閱
既然一直增加 那何不一次讀取全部 ? 不要查尋那麼多次 在一定筆數下應該可以控制記憶體的問題 除非資料超過 40 MB 以上,不然一次讀取完畢會比多次進出快,也不會有記憶體一直增加的問題 當然這是有代價的,就是一開始就會用掉許多記憶體 單看你如何去平衡,超過一定筆數資料後才用動態存取
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-11-11 08:59:11 IP:210.66.xxx.xxx 未訂閱
japhenchen兄!謝謝你的幫忙,小弟後來只有想辦法減少Query的次數,現在的狀況大概還可以! syntax兄!我的狀況是資料都在各個CSV檔裡,而且又要做很多計算,所以免不了要計算這麼多次,只能儘量想辦法減少計算的次數! timhuang兄!也謝謝你的意見! 因為只有japhenchen的解釋和我目前用法一樣,所以我把分數給japhenchen了!謝謝大家! Ian
系統時間:2024-11-01 8:15:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!