2

我有一个非常“一般”的问题。我正在使用 Revit API(使用 python)进行开发,有时我会观察到 Revit 会话在我的测试和试验期间变得更慢(Revit 保持打开的时间越长,它似乎发生的越多)。它没有达到真正有问题的地步,但无论如何它让我想到了它。

所以,由于我没有编程背景,我很确定我的代码充满了真正“非正统”的东西,这些东西可能会好得多。

是否有一些我可以遵循的基本“提示和技巧”(我的意思是,与 Revit API 相关)来帮助提高代码执行速度?或者我应该说:帮助减少内存使用?

例如,我已经了解了可用的“处理”方法,特别是在使用事务时(例如这里:http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects。 html),但最后我不太清楚这是否真的很重要(此外,因为我使用的是 Python,并且不知道这让我在讨论使用“使用”时处于什么位置或不)?

我应该“处理”所有东西吗?;)

除了'Dispose'方法,还有别的吗?

非常感谢,阿诺。

4

2 回答 2

6

基本:

好的,让我们在这里谈谈几个重要的点:

  • 您正在 IronPython 下运行脚本,它是 C# 语言中的 python 实现
  • C# 语言使用垃圾收集器来收集未使用的内存。
  • 垃圾收集器 (GC) 是一段程序,它会定期执行以收集未使用的元素。它使用一系列技术对目标内存区域进行分组和分类,以供以后收集。
  • 您的主程序被操作系统暂停以允许 GC 收集内存。这意味着如果 GC 在每个时间间隔都需要更多时间来完成它的工作,那么您的程序将会变慢并且您会遇到一些延迟。

问题:

现在回到这个问题的核心:python 本质上是一种面向对象的编程语言,IronPython 为所有内容创建objects(在概念上类似于 Revit 中的元素),从变量到类的方法再到函数和其他所有内容。这意味着所有这些对象在不再使用时都需要收集起来。

当使用 python 作为程序的脚本语言时,通常只有一个 pythonEngine来执行所有用户输入。

但是 Revit 没有命令提示符和关联的 python 引擎。因此,每次在 Revit 中运行脚本时,都会创建一个新引擎来执行该程序并最终死掉。

这会显着增加 GC 收集的未使用内存量。

解决方案:

我是 pyRevit 的创建者和维护者,这个问题在pyRevit v4.2中得到解决

解决方案是LightweightScopes = true在创建 IronPython 引擎时设置,这将强制引擎创建更小的对象。这大大减少了 IronPython 使用的内存,并增加了用户体验 Revit 性能下降的时间。

于 2017-05-24T14:29:45.303 回答
0

抱歉,我不能以低声誉发表评论,我使用另一种方法来减少内存,它不如 LightweightScopes 技巧漂亮,但它适用于昂贵操作后的一次性清理:

import gc

my_object = some_huge_object

# [operation]

del my_object    # or my_object = [] does the job for a list or dict
gc.collect()
于 2017-05-31T12:09:03.160 回答