使用 Revit API 进行编码:减少内存使用的技巧?

2024-03-20

我有一个非常“普遍”的问题。我正在使用 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(使用前将#替换为@)

使用 Revit API 进行编码:减少内存使用的技巧? 的相关文章

随机推荐

  • C26444 避免使用自定义构造和销毁未命名对象(es.84)

    谁能帮我解决问题吗 以前我只有一种类方法 它是无效的显示 向量与列表 字符串和过滤器 get display函数在里面 然后我决定将这些函数分成矢量 get 和 void display 但是当我返回一个新的修改向量时向量获取 出现错误 C
  • Python 函数定义中只有正斜杠吗? [复制]

    这个问题在这里已经有答案了 In the Python 3 8 编程常见问题解答 https docs python org 3 8 faq programming html how do i write a function with o
  • Java 中 null 对象的 hashcode 必须是什么?

    根据此评论post https stackoverflow com questions 11184041 how is hashcode calculated for null object hascode of null objects
  • 哪里可以找到免费的开源 Android 自定义控件?

    我正在寻找一些具有高级自定义 Android 控件的网站 库 项目 如果您知道其中之一 它们是免费且开源的吗 看一眼commonsguy github 存储库 https github com commonsguy 您可以在那里找到几个非常
  • PhantomJS 多个页面的意外加载行为

    我有一个脚本 如下 可以通过 3 个步骤来抓取网站 当设置为一次最多一页时效果很好 然而 当我将其增加到一次 2 个时 事情开始变得不稳定 onFinished 的触发时间比我预期的要早 并且页面尚未完全加载 因此 我的脚本的其余部分被破坏
  • 如何使视图变灰。具体来说是一个EditText?

    大家好 首先感谢您阅读本文 当我失去焦点时 我很难找到更改 EditText 的方法 我希望它在发生这种情况时变灰 但我不希望它被禁用 因为用户可以触摸它并稍后编辑文本 Anyone 问候 You can 为文本设置不同的颜色 http d
  • 显示目录列表控件中的文件

    有没有办法让用户使用 BrowseDlg 选择特定文件 我所能找到的是你只能选择一个文件夹 我相信文件选择是正在使用的 常见 功能之一 任何人都可以提供一些关于如何实现这一目标的建议 Thanks Update 我正在考虑为此创建一个 C
  • 如何使用 Uri 对象打开现有的 SQLite 数据库?

    我在用着Intent ACTION GET CONTENT选择一个文件 在方法中onActivityResult我得到的 Uri Uri selectedfile data getData 如何使用 Uri 对象selectedfile打开
  • 为什么 AVFoundation 不接受 iOS 设备上的平面像素缓冲区?

    我一直在努力找出我的代码有什么问题 我正在创建一个平面CVPixelBufferRef写信给AVAssetWriter 该像素缓冲区是通过其他一些过程手动创建的 即 我没有从相机或类似的东西获取这些样本 在 iOS 模拟器上 附加示例并创建
  • Xamarin Android 文件系统路径

    我正在尝试在 Android 文件系统上写入和读取文件 您认为这项任务很简单 但我似乎无法为实际存在的文件夹 路径找到正确的枚举器 我读过关于同一主题的几篇文章 但他们都没有给出这个问题的直接答案 而那些似乎已经解决了问题的人 却采用了似乎
  • Python dict 具有基于键的默认值

    我需要一个字典 它会自动填充每个缺失的访问键的默认值 我发现了defaultdict以及其他一些方法来实现此目的 但我的情况的问题是我希望每个键的默认值特定于该键本身 例如 与defaultdict我可以实现这样的目标 from colle
  • WPF 矩形填充水平或垂直线

    我正在尝试创建一个充满水平线或垂直线的矩形 矩形的宽度是动态的 因此我无法使用图像画笔 如果有人知道任何解决方案 请告诉我 我想出了一个直接的方法来做到这一点 最后 我使用以下视觉画笔资源分别用水平 垂直或垂直虚线填充矩形
  • VC++ 中的异常错误 c0000005

    正在开发 VC 控制台应用程序 此应用程序从 Appdata Roaming 文件夹发送文件一段时间 发生的情况是出现此崩溃错误 Problem signature Problem Event Name APPCRASH Applicati
  • 我是否必须在 iOS 的 Objective-C 中保留块?

    我想创建一个方法 它接受一个块 将其保存在成员中 启动异步任务 然后在异步调用进行完成回调时调用该块 我必须保留该块吗 块内存的管理方式是否与任何其他对象相同 我可以合成一个属性来持有该方块吗 块与内存管理的其他对象类似 但又不相同 当创建
  • Xamarin 强迫我下载 Android SDK 和 NDK

    我的计算机上安装了 Android SDK 和 NDK 在自定义位置 我正在尝试在 Windows 环境中安装 xamarin 但安装程序想要强制我安装 SDK 和 NDK 看起来无法通过安装文件夹找到 有没有解决方案可以指定何时安装我的
  • 如何以 json 格式(双引号)漂亮打印(人类可读的打印)Python 字典? [复制]

    这个问题在这里已经有答案了 这是一个后续问题this one https stackoverflow com questions 16087662 pprint how to use double quotes to display str
  • 错误:程序类型已存在:com.google.android.gms.internal.measurement.zzdz

    我看过关于这个主题的几篇类似的文章 但没有一个适用于我的情况 我根据这些帖子收集到 这可能是由我的 Firebase 依赖项之一引起的 但我不确定如何解决此问题 清理 失效等工作已经完成 我的所有依赖项都已更新到最新版本 这是我的 grad
  • NodeJS 响应当我直接从 MySQL 获取时 MySQL 时区不同

    当我直接请求MySQL时 我得到UTC日期 我在MySQL服务器中设置UTC 但是使用NodeJS我得到UTC 2本地时区数据 为什么 如何设置 NodeJS 获取 UTC 我在初始化mysql连接时在index js中添加了时区 var
  • Maya Python - 使用 UI 中的数据

    我正在开发一个脚本程序 并且在用户界面方面遇到了一些困难 我制作了几个用户界面 所有这些用户界面似乎都可以单独工作 但我不知道如何将用户界面中输入的数据使用到另一个函数 我正在尝试获取枪类型 由用户选择 Bullet Spray Gener
  • 使用 Revit API 进行编码:减少内存使用的技巧?

    我有一个非常 普遍 的问题 我正在使用 Revit API 使用 python 进行开发 有时我会观察到 Revit 会话在测试和试验期间变得更慢 Revit 保持打开状态的时间越长 这种情况似乎发生得越多 虽然还没有到真正有问题的地步 但