arrays - Excel 2007 VBA 数组大小限制

标签 arrays vba excel memory

我发现的许多资料表明,VBA 代码的数组大小取决于机器中的内存量。然而,这对我来说并非如此。我正在运行以下非常简单的代码来测试:

Sub test6()
Dim arr(500, 500, 500) As Boolean
End Sub

但是,如果我将大小更改为 600x600x600,则会出现内存不足错误。我使用的机器有 16Gb 的 RAM,所以我怀疑物理 RAM 是问题。

我使用的是 Excel 2007。是否有让 VBA 使用更多 RAM 的技巧?

最佳答案

如果有一个我们可以调用的 Application.UseMoreMemory() 函数就好了:-)

唉,我一个都不知道。

我看到的所有文档都说它受内存限制,但问题不是物理内存,而是您可以使用的虚拟地址空间。

您应该记住,虽然从 500 增加到 600 看起来只是适度的增加(尽管 20% 本身就足够大了),因为您是在三个维度上这样做的,所以结果是存储需求接近两倍。

根据内存,Excel 2007 使用短整数(16 位)作为 bool 类型,因此,您的 5003 数组至少会占用大约 250M (500x500x500x2)。

将所有尺寸增加到 600 会得到 600x600x600x2,或大约 432M。

在 32 位机器中可能拥有的 2G 可用地址空间内一切正常(我不知道 Excel 2007 64 位版本),但是这些东西是 < em>不小,而且你还必须与其他东西共享该地址空间。

看看你从什么时候开始开始得到错误会很有趣。

作为第一步,我将研究对如此大的阵列的需求。它可能以不同的方式可行,例如对数组进行分区,以便在任何时候只有一部分在内存中(类似于手动虚拟内存)。

对于真正的随机访问来说,这不太可能表现得那么好,但对于更多的顺序访问来说应该不会太糟糕,并且至少会让你继续前进(一个缓慢的解决方案比一个不工作的解决方案更可取)。

另一种可能性是抽象出位处理,以便您的 bool 值实际上存储为位而不是单词。

您必须为 getBoolsetBool 提供函数,在单词数组上使用位掩码运算符,同样,性能不会那么崩溃,但你至少可以达到相当于:

' Using bits instead of words gives 16 times as much. '
Dim arr(8000, 8000, 8000) As Boolean

与往常一样,这取决于您需要数组的用途及其使用模式。

关于arrays - Excel 2007 VBA 数组大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7817427/

相关文章:

php - 使用多级父->子数组创建单个 SELECT

excel - 使用VBA将工作表名称复制到行

arrays - 从基于另一个数组的数组中删除对象

javascript - 递归地反转数组中的元素

excel - VBA上次更改方法

excel - 使用 Excel VBA 调整列表框以显示长于列表框宽度的字符串

c# - 从 C# 中的 excel 中读取列索引和列值

excel - 动态生成的 Excel Xml(通过 OpenXml)有一个 x : in all of its tags

python - 如果 Python Pandas 中的值介于两次之间,则将 '1' 添加到单元格

PHP - 将数组作为可变长度参数列表传递