【问题标题】:Coding with Revit API: tips to reduce memory use?使用 Revit API 编码:减少内存使用的技巧?
【发布时间】:2017-10-24 15:25:48
【问题描述】:

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

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

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

例如,我已经阅读了有关可用的 'Dispose' 方法的信息,尤其是在使用事务时(例如这里:http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects.html),但最后我不太清楚这是否真的很重要,或者不是(此外,因为我使用的是 Python,并且不知道这让我在讨论是否使用“使用”)?

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

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

非常感谢, 阿诺。

【问题讨论】:

  • 问题:你是用pyRevit来运行Revit下的python脚本吗?如果是,是哪个版本?
  • @EhsanIrannejad 是的。我使用的是 4.7 版。
  • (而且我一直使用 RPS 和 Revit Lookup 来帮助调试。)
  • 如果您使用的是 pyRevit 版本,那么 2.7.7 是 IronPython 引擎版本。在 pyRevit>About 窗口 下找到 pyRevit 版本
  • 嗯。我很肯定我们在 4.2 中解决了这个问题,但显然我们没有。 ??????

标签: revit-api revitpythonshell pyrevit


【解决方案1】:

基础知识:

好的,我们这里讲几个重点:

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

问题:

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

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

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

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

解决方案:

我是 pyRevit 的创建者和维护者,此问题已在 pyRevit v4.2 解决

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

【讨论】:

    【解决方案2】:

    对不起,我不能以低声誉发表评论,我使用另一种方法来减少内存,它不如 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      相关资源
      最近更新 更多