簡體   English   中英

Excel VBA - 填充 Variant 數組會增加內存使用量

[英]Excel VBA - populating Variant array increase memory usage

我是新來的,如果我的問題已經得到回答,請提前抱歉,但我現在正在搜索幾天,但還沒有找到解決方案或解釋。

問題在於,在填充變體數組期間,內存消耗不斷增加。 數組是有維數的,當它第一次維數時,我可以看到內存消耗是如何增加相應數量的。 我認為一小段代碼比文字更能解釋它:

Sub test()
Dim Arr(1 To 1000000, 1 To 10) As Variant
Dim i As Long, j As Integer

For i = 1 To 1000000
    For j = 1 To 10
        Arr(i, j) = "AAAAAAAAA"
    Next j

Next i

End Sub

我對這段代碼的經驗是 - 在數組標注內存缺點之后。 增加約。 160 MB(即 10*1 000 000 * 16)。 執行完成后,我還額外增加了大約 400 MB! 有趣的是 - 如果你用一個數字替換字符串 AAAA,這個問題就消失了。

在實際程序中(這只是一個測試代碼)我有一個更大的大約數組。 600 MB,但在代碼執行結束時內存使用量為 3.4 GB! 結果是“內存不足”錯誤。

任何人都可以解釋一下嗎?

提前致謝,登

您所看到的原因是,當變體包含字符串時,實際的字符串數據並未在內部存儲。 一個變體由 16 個字節組成。 此處描述了這 16 個字節的布局。 請注意,其中 8 個字節包含類型信息之類的內容,另外 8 個字節包含該數據為數字時的實際數據。 當數據是字符串時,那 8 個字節是不夠的。 相反,這 8 個字節包含一個指向BSTR結構的指針,該結構由 4 個字節組成,包含字符串的長度、字符串中的實際字符(每個字符 2 個字節)和一個 2 個字符的空終止符。 對於長度為 9 的字符串,計算結果為 24 個字節,因此總共 16 + 24 = 40 個字節用於存儲該字符串(及其指向的變體)。 這解釋了為什么以這種方式存儲這 1000 萬個字符串時至少需要 400 MB。

如您所見,變體是一種記憶豬。 如果你真的需要為此使用 Excel VBA,你應該避免像瘟疫一樣的變體數組。 字符串本身不是很有效。 也許你可以做一些事情,比如將字符的 ascii 代碼存儲為字節,或者將許多字符串組合成一個字符串,可以在需要時拆分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM