2017-01-02 81 views
0

減少佔用的存儲器我有一個相當大的陣列:由多維變量數組在VBA

Global add_vit(0 To 6, 0 To 6, 2 To 18, 0 To 1300, 0 To 8) As Variant 

哪我填部分在模塊一個,子一個填滿,(這需要很長的時間)。我希望只執行一次子模塊。

一旦執行完成,我想要在模塊b,子程序2中訪問上述變量數組,並獨立運行模塊b子程序兩次,以驗證我在模塊b中工作的代碼,sub二。

我知道「全局」部分意味着即使在模塊a完成後,數組也會被填充/保留。這就是我所需要的,但同時,我運行在內存錯誤的邊界上。

我有幾個這樣的數組在運行模塊a,子系統2,它們都是相互連接的,在某些情況下,我需要將特定條目複製到其他特定的數組條目。這也阻止了我將這個最後一個全局數組的計算分解成另一個模塊。

當我在不同的時間運行相同的初始條件下的相同腳本時,我認爲這是因爲可用內存量爲「內存不足」 excel不是靜態的,但依賴於我在筆記本電腦上同時使用的其他進程。

有沒有人有關於如何保持相同數量的條目(雙打和長條),(或雙打和布爾)在存儲可訪問,(約8.000.000),同時仍然能夠訪問它們的建議當初始計算完成時,不需要佔用太多內存,從不同的模塊開始計算*

*如果不手動將它們存儲到excel表單中,這會很繁瑣並且會大幅減慢計算速度。

我也試着將整個陣列下面的腳本計算之前手動復位:

For A = 0 To 6 
    For B = 0 To 5 
     For C = 2 To 18 
      For d = 0 To 1300 
       For e = 0 To 4 
        add_vit(A, B, C, d, e) = "" 
       Next e 

       For f = 6 To 7 
        add_vit(A, B, C, d, e) = False 
       Next f 
      Next d 
     Next C 
    Next B 
Next A 
+1

重置陣列或內存管理的問題是什麼? – cyboashu

+1

你真的不打算爲內存消耗而打敗陣列。唯一的開銷是[SAFEARRAY]的20個字節(https://msdn.microsoft.com/en-us/library/windows/desktop/ms221482(v = vs.85)。aspx)標題(或64位計算機上的24),每個維度加上8個字節。其餘內存使用僅用於存儲在其中的項目。您需要使用持久性存儲(工作表或其他)或嘗試減少內存需求。 – Comintern

+0

爲什麼它是一個'Variant'數組?它裏面的數據真的是異構的?我這樣說是因爲如果您使用基本數據類型,即「Integer」,您可能能夠減少所需的內存大小。 –

回答

0

謝謝您的建議!

@ A.S.H謝謝我已經測試並確認,在子/模塊完成後,公衆也會保留它的價值。 所以我推特@ThunderFrame,你是對的,我可以使用公共而不是子,謝謝。

@ user3598756謝謝,那是我最初尋找的聲明,erase聲明。

@Absinthe我忘了提到模塊2實際上是一個通常用userfomX.show調用的形式的子類,我仍然需要查看變量是如何傳遞給它的。但主要是兩個模塊的分離是我正在尋找的,這意味着我想運行模塊2,而不需要每次運行模塊1,同時仍然使用模塊1的單次運行的存儲輸出。

非常感謝大家,你真棒!