我正在使用32位Excel 2010中的QuantlibXl庫分析大量歷史財務數據。我的典型工作表包含長達100萬行的經驗數據的長列。我的宏通常需要遍歷從頂部到底部的每一行,然後執行一些Quantlib典型的財務分析工具,例如重新評估安全性,這需要在每行中創建Quantlib對象。分析內容作爲公式包含在單元內。Excel VBA:數據處理宏運行時間越來越慢越慢
所以在開始時我試着選擇頂部有公式的單元格,並通過將右下角拖到工作表底部來填充它們。已經在這裏,處理時間隨着涉及的行數呈指數增長。
所以我想我不得不寫一個宏,一次處理更小的行塊。宏將基本上照顧一次只填充100行的第一行。這一點和許多優化(下面解釋)肯定會大大提高速度,但處理時間仍然呈指數級增長。
問題是,儘管我試圖優化我的宏,但它們運行的時間越長越慢。我跟蹤狀態欄中的處理行,例如,如果在啓動宏時每分鐘處理2000行(計算相當複雜),則其整個運行時速度會不斷降低,例如每個行只有100行分鐘後60,000行。在那個節奏下,它永遠不會看到表單的結尾。所以事實上,在某個時候,最好放棄它並從停止的地方再次啓動它。我還分割了這些文件,並讓它們同時運行在不同的計算機上,這對於管理來說是一種痛苦。
我已經實施了大量優化: - 屏幕更新和自動計算已關閉。 - 我只對正在處理的行進行一次計算。 - 垃圾收集:Quantlib對象在不再使用後立即被刪除。我認爲這是他們吃掉所有導致經濟減速的免費記憶。 - 我到目前爲止已經將相關結果(單元格)寫入文本文件,並刪除了不再需要的行。再說一遍,這個宏一開始速度非常快,如果在像70,000行之後沒有再次變慢,它會在幾個小時內運行到最後。事實上,我希望在運行時增加速度,因爲行被刪除,表單縮小,但它不會發生。所以我只停留在有6萬行的過程中,並再次啓動它,但它令人厭煩。
我想弄清楚是什麼原因導致Excel的這種行爲不能線性處理大量數據並且需要重新啓動以及如何避免它。如果有人遇到類似的麻煩並找到解決辦法,我很樂意聽到它。
編輯:每當我停止重新加速過程時,我都注意到我必須重新啓動Excel,否則恢復速度與之前一樣緩慢。我目前的假設是,在某些時候數據沒有被正確清理。如果是這種情況,您的解決方案將帶給我更多。 Quantlib庫有一個方法來查看有多少對象仍然駐留在稱爲ohRepositoryObjectCount()的內存中。在每次計算之後我都會調用ohRepositoryDeleteAllObjects()函數,並按照其他方法有效刪除它們,但可能仍然有一些泄漏未被發現。
編輯2:我現在確信存在內存泄漏,因爲在長時間批處理後,任務管理器顯示3個或4個Excel進程一起佔用大約1.5 GB的內存。當退出Excel時,它崩潰了(帶着「Excel不再工作」的消息),並且進程仍然存在,所以我必須手動殺死它們。
很難確切地說出問題所在,但它有助於發佈一些實際的代碼。你是否在長時間運行中監控內存使用情況 - 有沒有可能導致緩慢的內存泄漏? –
在運行期間,Excel的內存使用量從0.5 GB到1 GB不等,即使是32位版本的Excel也不算什麼。我不認爲發佈一些代碼會有所幫助,因爲大部分操作都發生在QuantlibXl的XLL加載項中。 – Steve06
也許它是你正在使用的quantlib庫的一個問題。如果你知道vba的方式,你是否嘗試編碼你自己需要的功能? – JMK