This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center




7年前关闭。





我正在使用32位Excel 2010中的QuantlibXl库分析大量历史财务数据。我的典型工作表包含多达一百万行的经验数据列。我的宏通常需要从上到下遍历每一行,并进行一些Quantlib典型的财务分析,例如重估安全性,这要求在每一行中都创建Quantlib对象。分析物质作为公式包含在单元格中。

因此,在开始时,我尝试只选择第一行中具有公式的单元格,然后通过将右下角拖动到工作表底部来向下填充它们。在这里,处理时间已经随着所涉及的行数呈指数增长。

因此,我认为我必须编写一个宏,一次处理较小的行块。宏基本上只会每次只填充100行。那和许多优化(如下所述)确实极大地提高了速度,但是处理时间仍然成倍增长。

问题是,尽管我尝试优化宏,但它们运行的​​时间越长,它们就会变得越来越慢。我在状态栏中跟踪已处理的行,例如,如果启动宏时每分钟处理2000行(计算非常复杂),则其速度在整个运行期间会不断降低,例如,每行仅减少100行60,000行后一分钟。以这种节奏,它将永远看不到纸页的尽头。因此,实际上,在某个时候最好中止它,然后从停止的地方重新开始。我还拆分了文件,并让它们同时在不同的计算机上运行,​​这在管理方面很麻烦。

我已经实现了大量优化:
-屏幕更新和自动计算被关闭。
-我只一次对正在处理的行执行计算。
-垃圾收集:Quantlib对象不再使用后将立即删除。我以为是他们吃尽了所有空闲内存,才导致速度下降。
-到目前为止,我已经将相关结果(单元格)写入文本文件并删除了不再需要的行。同样,该宏在开始时非常快,如果在经过70,000行之后又没有变慢的话,它会在几个小时内运行到结束。实际上,我曾希望看到运行时速度会有所提高,因为行将被删除并且工作表会缩小,但这只是没有发生。因此,我只是一直停止该过程,直到60,000行,然后再次启动它,但它很累人。

我想弄清楚是什么原因导致Excel的这种行为无法线性处理大量数据并需要重新启动,以及如何避免这种情况。如果有人遇到类似的麻烦并找到了解决方法,我将很高兴听到它。

编辑:每次我暂停以重新开始来加快速度的过程时,我注意到我必须重新启动Excel,否则它的恢复速度将与以前一样慢。我目前的假设是,有时无法正确清理数据。如果是这种情况,您的解决方案将带给我更多的帮助。 Quantlib库提供了一种方法,用于查看内存中仍有多少个对象,称为ohRepositoryObjectCount()。我在每次计算后都调用ohRepositoryDe​​leteAllObjects()函数,并且按照其他方法将它们有效地删除了,但是也许仍然存在一些泄漏,但仍未被发现。

EDIT2:我现在确信存在内存泄漏,因为经过长时间的批处理后,任务管理器显示3个或4个Excel进程一起消耗了大约1.5 GB的内存。退出Excel时,它崩溃(出现“ Excel不再工作”行的消息),并且该过程持续存在,因此我必须手动将其杀死。

最佳答案

如果我的假设是正确的,那么您的行就是所有证券的清单;并且彼此不相关;而且您不会对它们进行计算。如果正确,请执行以下操作:


在另一张纸上,布置所有数据列(输入和
输出)代表一行。
从“源”表中复制并粘贴值一行数据。
从源工作表中删除所有计算,并将其放在此处。
将值复制并粘贴回源表。


将#2到#4放入宏并遍历数据。

这就是我的答案,以下仅为评论。如果我正在这样做:


我的“源”数据将在数据库中。我确定有关系
在我将要探索的证券中。
我会将行元素转置到我的计算表上的一列中,以方便阅读。
为了便于阅读,我将计算分为多个列和多个部分。

关于excel - Excel VBA:数据处理宏越来越慢,运行时间越长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13094664/

10-11 03:00
查看更多