我有一个非常普通的'题。我正在使用Revit API(使用python)进行开发,我有时会观察到在我的测试和试验期间Revit会话变慢(Revit保持打开的时间越长,它看起来就越多)。它没有达到真正有问题的程度,但无论如何它让我想到了它。
所以,由于我没有编程背景,我很确定我的代码充满了非常正统的#39;事情可能会好得多。
是否会有一些基本的提示和技巧?我可以遵循(我的意思是,与Revit API相关)来帮助提高代码执行速度?或者我应该说:帮助减少内存使用?
例如,我已经阅读了关于“处理”的信息。方法可用,特别是在使用交易时(例如在这里:http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects.html),但最终我不是很清楚,如果这实际上非常重要(或者,因为我使用的是Python,并且不知道在哪里让我参与讨论使用"使用"还是没有)?
我应该只是'处理'一切? ;)
除了' Dispose'方法,还有别的吗?
非常感谢, 阿诺。
答案 0 :(得分:6)
<强>基础:强>
好的,让我们来谈谈几个要点:
<强>问题:强>
现在谈到这个问题的核心:
python是面向对象的编程语言,IronPython为所有内容创建objects
(与概念中的元素类似),从变量到类的方法,再到函数和其他所有内容。这意味着当它们不再使用时,需要收集所有这些对象。
当使用python作为程序的脚本语言时,通常会有一个python Engine
执行所有用户输入。
然而,Revit没有命令提示符和关联的python引擎。因此,每次在Revit中运行脚本时,都会创建一个执行程序的新引擎,并在最后终止。
这大大增加了GC要收集的未使用内存量。
<强>解决方案:强>
我是pyRevit的创建者和维护者,此问题已在pyRevit v4.2
中得到解决解决方案是在创建IronPython引擎时设置LightweightScopes = true
,这将强制引擎创建较小的对象。这大大减少了IronPython使用的内存,并增加了用户体验Revit性能下降的时间。
答案 1 :(得分: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()