Excel VBA:数据处理macros运行时间越来越慢越慢

我正在使用32位Excel 2010中的QuantlibXl库分析大量的历史财务数据。 我的典型工作表包含长达一百万行的经验数据的长列。 我的macros通常需要遍历从顶部到底部的每一行,并执行一些Quantlib典型的财务分析,比如重估安全性,这要求在每一行都创build一个Quantlib对象。 分析的东西包含在单元格中作为公式。

所以在开始的时候,我试着select顶部有公式的单元格,然后把右下angular拖到表单底部来填充它们。 已经在这里,处理时间与所涉及的行数呈指数增长。

所以我想我必须写一个macros,一次处理更小的行块。 macros基本上是照顾一次只填充100行的第一行。 这和一些优化(下面解释)肯定会大大提高速度,但处理时间仍然呈指数级增长。

问题是,尽可能多的我试图优化我的macros,他们越来越慢,他们跑得越来越慢。 我跟踪状态栏中的处理行,例如,如果在启动macros时每分钟处理2000行(计算相当复杂),则在整个运行期间其速度会不断下降,例如每个行只有100行60,000行之后。 在那个节奏下,它永远不会看到工作表的结尾。 所以实际上,在某个时候,最好是放弃它,然后从停止的地方重新开始。 我也分割了这些文件,让他们同时运行在不同的计算机上,这在pipe理上是一个痛苦的屁股。

我已经实现了大量的优化: – 屏幕更新和自动计算closures。 – 我只对正在处理的行进行计算。 – 垃圾收集:Quantlib对象在不再使用后立即被删除。 我以为是他们吃了所有的自由记忆导致了减速。 – 我到目前为止已经将相关结果(单元格)写入文本文件,并删除不再需要的行。 再说一遍,这个macros在开始的时候速度非常快,如果像70,000行之后再没有变得更慢的话,它会在几个小时内运行到最后。 事实上,我曾希望在运行时增加速度,因为行被删除,表单缩小,但是不会发生。 所以我只停留在六万行的过程中,再次启动它,但它却令人厌烦。

我想弄清楚是什么原因导致Excel的行为不能线性处理大量的数据,需要重新启动,以及如何避免它。 如果有人遇到类似的麻烦,并find解决办法,我很高兴听到这个消息。

编辑:每当我停止进程再次加速通过重新开始,我注意到,我必须重新启动Excel,否则恢复就像以前一样慢。 我目前的假设是在某些时候数据没有被正确清理。 如果是这样的话,你的解决scheme会给我带来更多。 Quantlib库有一个方法来查看有多less对象仍然驻留在称为ohRepositoryObjectCount()的内存中。 在每次计算之后,我都会调用ohRepositoryDe​​leteAllObjects()函数,并根据其他方法有效删除它们,但可能仍然有一些泄漏未被发现。

编辑2:我现在确信存在内存泄漏,因为在长时间批处理后,任务pipe理器显示3或4个Excel进程占用大约1.5 GB的内存。 当退出Excel,它崩溃(与“Excel不再工作了”的消息),并进程持续,所以我不得不杀死他们手动。

如果我的假设是正确的,你的行是所有证券的列表; 并不相关; 而且你不计算它们。 如果这是正确的,请执行以下操作:

  1. 在另一张纸上,布置所有数据列(包括input和输出)以表示一行。
  2. 从“源”表中复制并粘贴一行数据。
  3. 从您的源表中删除所有的计算,并把它放在这里。
  4. 将值复制并粘贴回源表单。

把#2到#4放到macros中并循环你的数据。

这是我的答案,以下只是评论。 如果我这样做:

  1. 我的“源”数据将在数据库中。 我敢肯定,我想探讨的证券之间有关系。
  2. 为了便于阅读,我会将行元素转换为计算表上的一列。
  3. 为了便于阅读,我将在多列和多部分中进行计算。