我有一个非常“普遍”的问题。我正在使用 Revit API(使用 python)进行开发,有时我会观察到 Revit 会话在测试和试验期间变得更慢(Revit 保持打开状态的时间越长,这种情况似乎发生得越多)。虽然还没有到真正有问题的地步,但无论如何它让我思考了..
因此,由于我没有编程背景,所以我很确定我的代码充满了真正“非正统”的东西,这些东西可能会更好。
是否有一些我可以遵循的基本“提示和技巧”(我的意思是与 Revit API 相关)来帮助提高代码执行速度?或者也许我应该说:帮助减少内存使用?
例如,我读过有关可用的“Dispose”方法的信息,特别是在使用事务时(例如这里:http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects.html http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects.html),但最终我不太清楚这是否真的非常重要(而且,因为我使用的是Python,并且不知道这让我在哪里讨论使用“使用”或不是)?
我应该“处理”所有东西吗? ;)
除了“Dispose”方法之外,还有其他方法吗?
多谢,
阿诺。
Basics:
好吧,让我们在这里讨论几个重要的点:
- 您正在 IronPython 下运行脚本,这是 Python 的 C# 语言实现
- C# 语言使用垃圾收集器来收集未使用的内存。
- 垃圾收集器(GC)是一段每隔一段时间执行一次的程序,用于收集未使用的元素。它使用一系列技术对目标内存区域进行分组和分类,以供以后收集。
- 您的主程序被操作系统暂停,以允许 GC 收集内存。这意味着,如果 GC 在每个时间间隔都需要更多时间来完成其工作,您的程序将会变慢并且您会遇到一些滞后。
Issue:
现在进入这个问题的核心:
python 本质上是一种面向对象的编程语言,IronPython 创建了objects
(概念上与 Revit 中的 Elements 类似)适用于一切,从变量到类的方法,再到函数和其他一切。这意味着所有这些对象不再使用时都需要收集。
当使用Python作为程序的脚本语言时,通常有一个PythonEngine
执行所有用户输入。
但是 Revit 没有命令提示符和关联的 python 引擎。因此,每次在 Revit 中运行脚本时,都会创建一个新引擎来执行该程序并在最后终止。
这极大地增加了 GC 收集的未使用内存量。
解决方案:
我是 pyRevit 的创建者和维护者,这个问题已解决pyRevit v4.2 http://eirannejad.github.io/pyRevit/pyrevit/update/2017/03/11/pyrevitfourtwo.html
解决方案是设置LightweightScopes = true
创建 IronPython 引擎时,这将迫使引擎创建更小的对象。这极大地减少了 IronPython 使用的内存,并增加了用户体验 Revit 性能下降的时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)