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

Arn*_*aud 2 revit-api revitpythonshell pyrevit

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

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

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

例如,我已经阅读了可用的'Dispose'方法,特别是在使用Transactions时(例如:http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects). html),但最后我不是很清楚这是否真的非常重要(此外,因为我使用的是Python,并且不知道在哪里让我参与讨论使用"使用"或不)?

我应该'弃置'一切吗?;)

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

非常感谢,Arnaud.

Ehs*_*jad 6

基本:

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

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

问题:

现在谈到这个问题的核心:python是一种面向对象的编程语言,而IronPython创建objects(在概念上类似于Revit中的Elements),从变量到类的方法,再到函数和其他所有东西.这意味着当它们不再使用时,需要收集所有这些对象.

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

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

这大大增加了GC要收集的未使用内存量.

解:

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

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

  • 接得好!我已将此添加到我的RPS任务列表中! (2认同)