小弟建立了 階層式的元件 一共有五個class 分三層。沒有撰寫任何程式碼,只有宣告了幾個屬性和Collection ,每一個 子class 都是使用 collection 裝著的。
資料是使用 shape RS 讀出的 (rs 資料只有四筆)
今天早上小弟就試著將同一個 rs 的資料寫 十萬次 到元件中。
(rs 沒有開開關關)
小弟發現 記憶體耗得很兇,才跑了 五萬次 memory 就吃了 四百mb 。 請問 小弟應該要怎麼做才好呢?
資料是使用 shape RS 讀出的 (rs 資料只有四筆)
今天早上小弟就試著將同一個 rs 的資料寫 十萬次 到元件中。
(rs 沒有開開關關)
小弟發現 記憶體耗得很兇,才跑了 五萬次 memory 就吃了 四百mb 。 請問 小弟應該要怎麼做才好呢?
文章標籤
全站熱搜

可能是太多層元件的關系吧?? 剛剛 小弟只丟一兩層的物件進去 collection 的話! 載入一百萬次 只花費三十幾 mb (還是覺得太大) ,可能是結構有問題吧! 小弟還在測試中。
試試看不使用 Collection, 直接宣告 子Class 的型態 也許有點幫助
To 大家: 抱歉 剛剛小弟看錯了,小弟只有看到迴圈數忘了數 迴圈執行的次數,所以不是跑五萬次 ,而是 跑了二十萬次 吃了 四百mb 。 在此小弟認錯。 ---------------------------------------------- To 呆子 謝謝您的回應,不過小弟是 一對多的方式,所以才用 collection ,不知是否有較好的方案可以使用?? 煩請指教,謝謝。 ------------------------------------------------ 後來小弟再把所有的 class 開啟的動作全部提成 private ,在各個 sub 之間的子class 就不再 開開關關了,只負責寫值而已,再傳回物件丟入 collection 。 這樣子memory 的消耗,有著明顯的下降, 載入 八十五萬次 (每次皆有五個子class ) 耗了 二百零九 mb 。(雖然還是太大,不過比剛剛好一些!), 但是,執行的速度很慢又很久。 請問,還能改善什麼的嗎?
所有的 class 開啟的動作全部提成 private 的這個做法,小弟後來去檢查裡面的值發現, 全部都變成一樣的了 @@ ,所以 還在測試中
用物件基本上會比用 Type 更耗時根記憶體 以前在本站討論過
一些Collection可以用Array來替代, 不過把資料庫全部讀進物件中好像不是很必要...
所謂載入一次是指讀取又釋放嗎?會消耗記憶體代表有資源沒有釋放囉?
謝謝回應 To ChrisTorng 兄 private o as new class 小弟是 這樣子算整個一次載入,所以這整個會做 很多次。由於所有的資料都是要使用的,因此不釋放記憶體。 ------------------------------ For i = 0 to 1000000 o.add 物件a o.物件a(index).add 物件b o.物件a(index).物件b(index).add 物件c Next ------------------------------ To Shownic 兄 一、謝謝,小弟會試試看使用 Array。 二、其實資料庫讀進的資料有兩個部分, 商品一次最多只會有五十筆,另一部分是特價專案會依 那五十筆商品而篩選出不同的專案,小弟猜想 應該不會超過五百個專案吧!(這一筆含五個table )。 在一此組合情況下,也許一樣商品會符合多個不同的專案,而同一商品還不能重複組合。 所以,小弟就會想要把,這五十筆商品和 特價專案進行,列出所有的商品特價組合 (這裡是要用程式產生出來的) ,所以小弟才會想要把這些資料全數放到 元件中。 To 熱情 兄 謝謝您的提醒,小弟有想起來是有這麼一篇文章。
我的那個解法, 是先開好Class陣列, 例如在Class_B 中 Private c_array(500) AS class_C ..... Public Sub Add_One_C( ..... ) { }
在 Add_One_C 的時候, 才 Set c_array(index) = New class_C 不過, 還是Shownic 兄建議的 Array 法比較省記憶體
光以您所列出的程式碼而言,就有兩點可以改善: 1.不要 dim o as new class1,這樣做是省掉一行 set o = new class1,但卻付出每次使用 o 時均檢查 o 物件是否已建立的代價,應該改用 dim o as class1,然後明確的 set o = new class1 會比較快。 2.物件的層層引用,每次均要從頭開始找起,以這行來說 o.物件a(index).物件b(index).add 物件c,會先取得 o 物件,再由 o 的 collection 中取得第 index 的物件a,再找一次 collection 物件b,再呼叫物件 b 的 add 函式。如果物件只用一次那沒問題,但用很多次的話,可以善用 with,因此應該改成如下: with o For i = 0 to 1000000 .add 物件a with .物件a(index) .add 物件b with .物件b(index) .add 物件c end with end with next i end with 我想這樣改應該會看得出效能上的改善才對…這個方法不管 collection 或 array 都可以用。
謝謝回應,小弟這一兩天測試了這一方面的,雖有所突破卻還不能拿來實用。 首先小弟報告測試的結果。 跑二萬次 (每一層都有開啟) 花費 40 mb 和 40 Sec ,若是只開了兩層的話!花費14 mb 和 14 sec 。以上是平均值、cpu p3 1Ghz 記憶體 512 作業系統 xp pro 。 小弟在想,是不是要換個思考方向,不要要求排列出所有的組合,也許會比較好吧??