2017-05-24 3 views
2

나는 꽤 일반적인 질문을 가지고있다. Revit API (Python과 함께)로 개발 중이며, 때때로 테스트와 평가 중에 Revit 세션이 느려지는 것을 관찰하고 있습니다. (Revit이 길어질수록 더 많은 일이 일어날 것입니다.) 그것은 실제로 문제가 될만한 지점에 도달하지는 못했지만 어쨌든 그것에 대해 생각하게 만들었습니다 ..Revit API로 코딩 : 메모리 사용을 줄이는 방법?

프로그래밍 배경이 없으므로 코드가 정말로 '정통'으로 가득 차 있다고 확신합니다. 훨씬 더 좋을 수있는 것들.

코드 실행 속도를 높이기 위해 내가 따를 수있는 ('Revit API와 관련된') 기본 '유용한 정보'가 있습니까? 아니면 내가해야 할 말 : 메모리 사용을 줄이기 위해?

예를 들어 트랜잭션 (예 : http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects.html)을 사용할 때 특히 'Dispose'방법을 사용할 수 있지만 실제로는 매우 중요하거나 그렇지 않으면 결국 명확하지 않습니다. (그리고 더구나, 파이썬을 사용하고 있고, "사용"에 관한 논의에서 내가 어디에 사용하는지 알지 못한다.)

모든 것을 '폐기'해야합니까? ;)

'처분'방법 외에도 다른 방법이 있습니까?

고마워, 아르노.

+0

질문 : pyRevit을 사용하여 Revit에서 파이썬 스크립트를 실행하고 있습니까? 그렇다면 어떤 버전입니까? –

+0

@ EhsanIrannejad 예. 나는 버전 4.7을 사용하고있다. – Arnaud

+0

(그리고 디버깅을 돕기 위해 RPS와 Revit Lookup을 항상 사용합니다.) – Arnaud

답변

6

기본 사항 :

좋아의 여기에 몇 가지 중요한 점에 대해 이야기하자

    C# 언어
  • C# 언어의 사용에 파이썬의 구현을 당신이 IronPython의에서 스크립트를 실행하는
  • 사용하지 않는 메모리를 수집하는 가비지 수집기.
  • 가비지 수집기 (GC)는 사용되지 않은 요소를 수집하기 위해 주기적으로 실행되는 프로그램입니다. 일련의 기술을 사용하여 나중에 수집 할 대상 메모리 영역을 그룹화하고 분류합니다.
  • GC가 메모리를 수집 할 수 있도록 운영 체제에 의해 주 프로그램이 정지되었습니다. 즉, GC가 각 간격마다 작업을 수행하는 데 더 많은 시간이 필요할 경우 프로그램이 느려지고 일부 지연이 발생합니다.

문제 :이 문제의 심장에 이제

: 파이썬은 마음에서 객체 지향 프로그래밍 언어이며, IronPython의은, 모두를위한 objects (개념 REVIT의 요소와 유사)를 작성 클래스의 메소드에 대한 변수와 함수에 대한 모든 것. 즉,이 모든 객체는 더 이상 사용하지 않을 때 수집해야합니다.

프로그램 용 스크립트 언어로 파이썬을 사용하는 경우 일반적으로 모든 사용자 입력을 실행하는 단일 파이썬 Engine이 있습니다.

그러나 Revit에는 명령 프롬프트와 관련 파이썬 엔진이 없습니다. 따라서 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() 
관련 문제