使用Revit API编码:减少内存使用的提示?

时间:2017-05-24 10:28:40

标签: revit-api revitpythonshell pyrevit

我有一个非常普通的'题。我正在使用Revit API(使用python)进行开发,我有时会观察到在我的测试和试验期间Revit会话变慢(Revit保持打开的时间越长,它看起来就越多)。它没有达到真正有问题的程度,但无论如何它让我想到了它。

所以,由于我没有编程背景,我很确定我的代码充满了非常正统的#39;事情可能会好得多。

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

例如,我已经阅读了关于“处理”的信息。方法可用,特别是在使用交易时(例如在这里:http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects.html),但最终我不是很清楚,如果这实际上非常重要(或者,因为我使用的是Python,并且不知道在哪里让我参与讨论使用"使用"还是没有)?

我应该只是'处理'一切? ;)

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

非常感谢, 阿诺。

2 个答案:

答案 0 :(得分:6)

<强>基础:

好的,让我们来谈谈几个要点:

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

<强>问题:

现在谈到这个问题的核心: 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()