Я действительно не знаю, что происходит, но это связано с внутренним содержимым того, что entry
содержит, и как это записывается в массив.Каким-то образом массив в конечном итоге потребляет больше памяти, если он был сконструирован, в то время как entry
был сгенерирован таким, каким он был - и массив - единственное, что может иметь память, выделенную для него, нет ничего «просочившегося».
Чтобы лучше продемонстрировать проблему, давайте удалим код, который нам не нужен, упростим объявление границ массива и уберем из цикла все, кроме присваивания entry
:
Private Sub store_values()
Dim entry As String
Dim rw As Long
Dim aa As String
Dim bb As String
Dim cc As String
Dim dd As String
Dim ee As String
Dim jj As Long
Dim ff As String
Dim ll As String
Dim mm As String
Dim nn As String
Dim kk As String
aa = String(10000, "w")
bb = String(125, "w")
cc = String(126, "w") ' Increased from 125 to 126
dd = String(125, "w")
ee = String(125, "w")
ff = String(125, "w")
kk = String(125, "w")
ll = String(125, "w")
mm = String(125, "w")
nn = String(125, "w")
ReDim VBFlexGridCells(0 To 9, 1 To 15000)
For rw = 1 To 15000
entry = aa & Chr(9) & bb & Chr(9) & cc & Chr(9) & dd & Chr(9) & ee & Chr(9) & ff & Chr(9) & kk & Chr(9) & ll & Chr(9) & mm & Chr(9) & nn
Dim abc() As String
abc = Split(entry, vbTab) ' Returns zero-based array
For jj = LBound(abc) To UBound(abc)
VBFlexGridCells(jj, rw) = abc(jj)
Next
Next
End Sub
Выполнение этого потребует около700 МБ памяти.
Теперь, если мы переместим назначение entry
из цикла:
ReDim VBFlexGridCells(0 To 9, 1 To 15000)
entry = aa & Chr(9) & bb & Chr(9) & cc & Chr(9) & dd & Chr(9) & ee & Chr(9) & ff & Chr(9) & kk & Chr(9) & ll & Chr(9) & mm & Chr(9) & nn
For rw = 1 To 15000
Dim abc() As String
abc = Split(entry, vbTab) ' Returns zero-based array
For jj = LBound(abc) To UBound(abc)
VBFlexGridCells(jj, rw) = abc(jj)
Next
Next
будет использовано только около 320 МБ, что действительно странно.
Таким образом, один из способов получить нормальное потребление памяти - это вывести назначение entry
из цикла .
Если это не вариант (потому что в производственном кодеentry
отличается на каждой итерации), есть другой подход: может показаться, что копирование массива также оптимизирует память, которую он потребляет :
Dim temp_array(0 To 9, 1 To 15000) As String
For rw = 1 To 15000
entry = aa & vbTab & bb & vbTab & cc & vbTab & dd & vbTab & ee & vbTab & ff & vbTab & kk & vbTab & ll & vbTab & mm & vbTab & nn
Dim abc() As String
abc = Split(entry, vbTab) ' Returns zero-based array
For jj = LBound(abc) To UBound(abc)
temp_array(jj, rw) = abc(jj)
Next
Next
'Here we are consuming 700 Mb
VBFlexGridCells = temp_array ' Copying
'Here we are consuming 1020 Mb
End Sub ' Here we are consuming 320 Mb
Если у вас есть enoтьфу память, чтобы пережить момент, когда «правильный» и «раздутый» массив существуют одновременно, это также может быть решением.
Я действительно потерян, почему это происходит иначе.