以下是这种情况:
我不明白为什么会这样,我在实验管理器中尝试调暗较小的阵列并观察资源使用情况,观察Excel使用每10,000行<28Mb 行(相同)列数)。
如果我(保守地)考虑Excel只能使用另一个1000Mb,按此逻辑它应该能够处理350,000行(相同的列数)。
我错过了什么?我能做些什么不同的事情?
由于
编辑:这是代码处理的前提,这个简单的代码重新创建了问题。
Public arrTest() As String
Sub test()
ReDim arrTest(20000, 700)
End Sub
答案 0 :(得分:0)
您可以利用以下一种或多种技术:
在需要时分配内存
您确实需要arrTest()
数组为Public
吗?
Public
数组变量只要它们的大小和#34;就会被分配。并留在那里直到它结束
这意味着其他子变量声明带来的每个后续内存分配都会添加到Public
个
如果arrTest()
中只需要Sub test()
,那么只需将其声明移到后一个
Sub test()
Dim arrTest(20000, 700)
End Sub
一旦退出,arrTest()
内存分配就会被释放
否则,出于同样的原因,您需要arrTest()
跨多个潜水艇:
在使用它的第一个Sub
中声明它
将其作为参数传递给需要使用/处理它的其他Subs
Sub main()
sub1 '<--| call 'Sub1(): at this stage no memory allocation has taken place for any 'arrTest()' array
'once out of 'sub1' any memory allocation for any 'arrTest()' array has been released
End Sub
Sub sub1()
Dim arrTest(20000, 700) As String '<--| here memory allocation takes place for 'arrTest()' array
sub2 arrTest '<--| pass 'arrTest()' array to Sub2
'at exiting this sub, the 'arrTest()' memory allocation gets released
End Sub
Sub sub2(stringArray() As String)
'here 'arrTest()' array memory allocation stays the same
'code to exploit passed array
End Sub
分配 内存
站在前面的第1点,根据实际所需的数量调整数组的大小,这也是您使用动态数组而不是 static <的原因/ em>一些
Sub sub1()
Dim arrTest() As String
Dim nRows As Long, ncols As Long
With Worksheets("Data")
nRows = .Cells(.Rows.Count, 1).End(xlUp).row
ncols = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With
ReDim arrTest(1 To nRows, 1 To ncols) As String '<--| here memory allocation takes place for 'arrTest()' array
sub2 arrTest '<--| pass 'arrTest()' array to Sub2
'at exiting this sub, the 'arrTest()' memory allocation gets released
End Sub
使用工作表范围
如果之前的所有努力都在风向标中,那么您只需使用Excel范围和尽可能多的内置函数来利用已经存储在那里的数据
这很可能会引发性能问题,但至少它会运行......
希望这一切可以帮助你