2009-11-23 4 views
4

I가 선언 된 다차원 동적 배열에 순서 요소 ("일"또는 "밤"열거 형)을 추가하는 루틴 등 :대형 동적 배열 -가 느린

TShiftType = (stDay, stNight); 
TScheduleArray = array of array of array [1..DaysPerWeek] of TShiftType; 

배열 요소 1 개 (예 : (Day, Day, Day, Day, Day, Night, Night))와 요소 20,000 개 이상을 포함 할 수 있습니다. 각 요소는 처리되는 주 수에 따라 하위 요소가있을 수 있습니다.

((stDay, stDay, stDay, stDay, stDay, stNight, stNight), (stDay, stDay, stDay, stDay, stDay, stNight, stNight))

이 매우 빠른 실행 및 요소의 수 (천에서 약) 상대적으로 낮을 때 아주 잘 작동 : 같은

그래서 2 주 배열의 한 요소를 볼 수 있었다. 주와 요소 수가 늘어 나면 배열에 새로운 요소를 추가하기 만하면 (배열의 길이를 1 씩 늘리려면 SetLength을 호출 한 후) 기하 급수적으로 속도가 느려집니다.

간혹 액세스 위반이 발생합니다. 델파이에서 "오류 찾기"기능을 사용하면 CPU 창에서 @DynArrayAsg 메쏘드로 이동합니다. 그러나 나는 변수를 재 할당하기에 충분한 메모리가 없다면 델파이 도움말에서 얻을 것이라고 말하는 예외를 결코 얻지 못한다 (EOutOfMemory).

메모리 예상 동작에 대한 액세스 속도가 느려 집니까? 델파이 6을 사용하고 있습니다.

답변

7

네가 재 할당 할 때 기존 배열의 끝에 하나의 요소를 추가하기에 충분한 인접한 공간이 없으면 충분히 큰 또 다른 블록을 찾아서 할당해야하므로, 기존 배열 전체를 복사 한 다음 원본을 할당 해제합니다. 어레이가 클수록 복사본이 길어집니다.

TList는 "필요한만큼 정확하게"대신에 내부 배열을 2의 제곱 크기로 할당하고 Count 변수를 사용하여 실제로 사용되는 것의 상한을 표시함으로써이 문제를 완화하는 데 도움이됩니다 . 어쩌면 당신은 비슷한 것을 할 수 있을까요?

또한 아직 가지고 있지 않은 경우 FastMM을 얻으십시오. Delphi 6의 내장 메모리 관리자보다 메모리를 할당하고 재 할당하는 것이 훨씬 낫습니다.

+0

감사합니다 메이슨, 좋은 설명. D2009 (FastMM 부분 용)는 기다리고 있지만 제 3 자 구성 요소가 현재 서 있습니다. 내가 다차원 배열을 가지고있는이 경우 TList가 더 나은 해결책이 될 것이라고 생각합니까? –

+0

아마도 그렇지는 않지만 TList가 구현되는 방식을보고이를 자신의 3 차원 배열 클래스를 작성하기위한 템플릿으로 사용할 수 있습니다. –

+0

감사. 원래 질문에 답한 이유에 대해 감사 드리며 감사드립니다. –