2017-05-24 43 views
2

我有一個相當「普遍」的問題。我正在使用Revit API(使用python)進行開發,並且我有時會觀察到Revit會話在我的測試和試用期間變得越來越慢(Revit保持打開的時間越長,似乎發生的越多)。它沒有達到它真的有問題的地步,但它讓我想起它無論如何..使用Revit API編碼:減少內存使用的提示?

因此,由於我沒有編程背景,我很確定我的代碼充滿了'非正統'事情可能會好得多。

會有一些基本的'提示和技巧',我可以遵循(我的意思是,與Revit API有關)來幫助代碼執行的速度?或者,我應該說:幫助減少內存使用?例如,我已閱讀了有關'Dispose'方法的可用方法,特別是在使用事務(例如:http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects.html)時,但最終我不很清楚,如果這實際上非常重要,可以執行或不執行(此外,因爲我使用Python,並且不知道哪裏讓我參與關於使用「使用」的討論)?

我應該只是'處置'一切? ;)

除了'Dispose'方法,還有別的嗎?

非常感謝, Arnaud。

+0

問題:你使用pyRevit在Revit下運行python腳本嗎?如果是,哪個版本? –

+0

@EhsanIrannejad是的。我正在使用4.7版。 – Arnaud

+0

(並且我一直使用RPS和Revit Lookup來幫助調試。) – Arnaud

回答

6

基礎:

好讓我們來談談幾個重點位置:

  • 你的IronPython下運行腳本,這是蟒蛇在C#語言
  • C#語言使用的實現垃圾收集器收集未使用的內存。
  • 垃圾收集器(GC)是一段程序,它每隔一段時間執行一次以收集未使用的元素。它使用一系列技術對目標內存區域進行分組和分類,以供以後收集。
  • 您的主程序被操作系統暫停以允許GC收集內存。這意味着如果GC需要更多時間在每個時間間隔內完成工作,您的計劃將變得緩慢,您會遇到一些滯後。

問題:

現在對這個問題的心臟: 蟒蛇是在心臟的面向對象的編程語言和IronPython創建objects(類似於在Revit元素的概念)的一切,從你的變量,以一個類的功能和其他一切方法。這意味着所有這些對象在不再使用時都需要收集。

當使用python作爲程序的腳本語言時,通常會有一個python Engine執行所有用戶輸入。

但Revit沒有命令提示符和關聯的python引擎。因此,每次在Revit中運行腳本時,都會創建一個執行程序並在最後死亡的新引擎。

這大大增加了GC收集未使用內存的數量。

解決方案:

我的創造者和pyRevit的維護人員,這個問題pyRevit v4.2

溶液決心是設置LightweightScopes = true創建IronPython的引擎時,這將迫使發動機創建更小的對象。這大大減少了IronPython使用的內存,並增加了用戶體驗Revit性能下降的時間。

+2

好趕上!我已將此添加到RPS的任務列表中! –

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()