4

我正在使用 32 位 Excel 2010 中的 QuantlibXl 库分析大量历史财务数据。我的典型工作表包含长达 100 万行的长列经验数据。我的宏通常需要从上到下遍历每一行,并执行一些 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 不再工作”的消息),并且进程仍然存在,因此我必须手动终止它们。

4

1 回答 1

0

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

  1. 在单独的工作表上,布局所有数据列(输入和输出)以表示一行。
  2. 从“源”工作表中复制并粘贴一行数据的值。
  3. 从源表中删除所有计算并将其放入此处。
  4. 将值复制并粘贴回源工作表。

将 #2 到 #4 放入宏中并循环遍历您的数据。

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

  1. 我的“源”数据将在数据库中。我确信我要探索的证券之间存在关系。
  2. 为了便于阅读,我会将行元素转换为计算表上的一列。
  3. 为了便于阅读,我将跨多个列和部分分解计算。
于 2012-10-27T16:22:04.987 回答