【问题标题】:Excel VBA Out of Memory Error during Array Initialization数组初始化期间 Excel VBA 内存不足错误
【发布时间】:2020-05-23 23:30:17
【问题描述】:

尝试初始化数组时,我在 Excel 2010(32 位版本)中遇到错误。该错误特别指出:“内存不足”我还应注意,我正在使用 32 GB RAM 的 64 位计算机上进行编码。

这是我正在使用的代码:

   Sub ArrayTest()
   Dim C As Variant
   ReDim C(50257, 768) As Variant
   Dim row As Integer
   Dim column As Integer

   For row = 1 To UBound(C, 1)
       For column = 1 To UBound(C, 2)
           C(row, column) = rnd
       Next
   Next
   End Sub

当我尝试 ReDim C() 时发生错误。

到目前为止我尝试了什么:

我想我可能已经达到了 Variant 数据类型的限制。所以我尝试重新调整一个 Double 类型的数组。我遇到了同样的错误。我成功使用了 Integer 数据类型,但问题是我需要使用此数组捕获浮点数据(如 Rnd 函数所示)。

有人建议我尝试使用字节数组。但是字节数组只能捕获整数数据。所以那也没用。我考虑的另一个选择是使用 Win32 API 来查看是否可以在 Excel 之外的内存中分配数组。特别是 VirtualAlloc() 函数。我还没有真正尝试过,因为我不确定它是否会起作用。有人告诉我,如果您使用的底层程序是 32 位的,那么它将无法工作。

无论如何,在这一点上,我对我应该做什么感到困惑。我可能会考虑使用 Access 数据库来存储数据(50257 x 768 = 38,597,376 个数据元素)。不过,这会显着减慢代码速度。

有没有办法解决这个问题?

【问题讨论】:

  • 使用Long 而不是Integer。也将Randomize 也扔在那里 - 也许至少给文档一个阅读,然后决定你是否想要它。

标签: arrays excel vba


【解决方案1】:

我相信 Excel 的内存使用限制为 4gb。 Variant 输入takes up 16 bytes。

所以基本上你有50257*768*16字节分配给redim这个怪物。那是6,175,580,288 或 6.1gb。

如果您将该数组声明为Double,您将减半,因此~3gb 或将其声明为Single,将大小减半为~1.5gb,它可能会成功。

【讨论】:

  • OP 必须已经有工作表的喇叭了。我添加了使用单一的建议,假设对于这些数百万个随机数来说足够大。这是一个庞大的数据集和有限的内存量,因此继续在 excel 中完成这项工作将是一条钢丝。
  • 哇,使用 Single 就像一个魅力。谢谢你。我以前从未使用过单一数据类型。它主要用于什么?至于喇叭工作表大声笑,我正在尝试在 Excel 中构建一个聊天机器人。可能会让我的工作更有趣。
  • 它只是一个 4 字节的浮点数,而不是 8 字节的双精度数。本质上,它会比 8gb 更频繁。
猜你喜欢
  • 2016-07-10
  • 1970-01-01
  • 2014-12-25
  • 2017-11-14
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
相关资源
最近更新 更多