内存不足第二次运行

时间:2015-09-23 07:37:47

标签: arrays excel vba csv memory

当我尝试从CSV文件加载大型数组时,会发生意外情况。该文件有100000行和100列(80mb)。我已经尝试了很多方法来快速加载CSV(因为速度至关重要)。下面的代码第一次工作正常,但是当我第二次运行它时,变量title(String)或redim arrRaw(Variant)会给出一个“内存不足”的状态。错误。重新启动Excel后,它再次正常工作一次。 它们都是本地声明的变量。我曾尝试使用公共声明然后擦除数组,但这种做法很有用。我的系统显示RAM内存没有问题。是否有解决此问题的方法(或解决方案)?

Open filepath For Binary Access Read As #i
Get #i, , res
Close i

title = Split(Right(Left(res, Len(res) - 1), Len(Left(res, Len(res) - 1)) - 1), vbLf)
columnsArr = UBound(Split(title(1), ";"))
rowsArr = UBound(title)

ReDim arrRaw(1 To rowsArr, 1 To columnsArr)

Call timerClock(True)

For i = 0 To rowsArr
    TmpAr = Split(title(i), ";")
    For j = 0 To UBound(TmpAr) - 1
        If IsNumeric(TmpAr(j)) Then
            arrRaw(i + 1, j + 1) = TmpAr(j)
        Else
            arrRaw(i + 1, j + 1) = 0
        End If
    Next j
Next i

2 个答案:

答案 0 :(得分:1)

您是否已将所有变量设置为"没有"工作完成后?

无论如何,我想和你分享一个提示:如果你正在使用" title"中的字符串,请替换所有"对"和"左"函数"对$"和"离开$"。您的结果会快5%或10%。另外,尝试不要做两次或更多次,例如:

Left(res, Len(res) - 1)

...最好将它分配给变量并使用它。

答案 1 :(得分:0)

我不清楚你分配的内容i = FreeFile ...?)但是这个免费文件句柄的替代方法可能会更好地清除文件句柄。

Open filepath For Binary Access Read As #1
Get #1, , res
Close #1

无论如何,您自己的代码应该使用Close #i