var
i:integer;
a:Array [1..255] of TSmallintArray;
begin
for i:=1 to 255 do
begin
A[i]:=TSmallIntArray.Create(0,0);
A[i].AutoSize:=false;
A[i].Capacity:=30000;
end;
end;
이렇게 실행을 하면 Capacity 부분에서 다음과 같은 에러가 떨어집니다.
ELowCapacityError With message
'The DecisionCube Capacity is low. please deactivate dimensions or change the data set.'
그런데 이상한건 똑같은 소스가 노트북(인텔싱글코어)에서는 안그러는데 데스크탑(AMD 듀얼코어)에서만 그럽니다.
쓰고 있는 건 Delphi7버전입니다.
하루 종일 왜그럴까 생각해 보고 데스크탑 델파이를 재설치와 델파이 서비스팩 업그레이드도 해보았지만
도무지 감조차 오지 않습니다ㅜ
차이점이라면 CPU가 싱글이냐 듀얼이냐 차이뿐인데ㅜ
아시는 분 조언 부탁합니다.
var
a:TSmallintArray;
begin
A:=TSmallIntArray.Create(0,0);
A.AutoSize:=false;
A.Capacity:=30000;
end;
이 경우도 마찬가지입니다.
그리고 AMD싱글코어 데스크탑과 인텔 듀얼코어에서도 테스트해본바 정상 작동합니다.
본 컴퓨터의 윈도우도 다시 깔아봤지만 여전히 위와 같은 에러가 떨어집니다.
도대체 왜 그런지 답답하기만 합니다;;
델파이 버그네요;;
델마당의 빠야님께서 도움주셔서 알게됐습니다;;
해결법은 아래와같이 Unit를 만들어서 Project에 포함시켜서 컴파일하니 해결됩니다.
{-------------------------------------------------------------------------------
Bug workaround for 'The DecisionCube capacity is low' bug
________________________________________________________________________________
BUG DESCRIPTION
If you have a lot of physical memory or a large page file, you may find that a
DecisionCube raises the following exception whenever the DecisionCube's data
set is opened:
Exception class: ELowCapacityError
Message: "The DecisionCube capacity is low. Please deactivate dimensions or
change the data set."
The exception will occur whenever the sum of the available physical memory and
the available page file memory exceeds 2 GBytes. This is caused by a bug in
Delphi - more specifically: an integer being out of range in the procedure
GetAvailableMem (unit Mxarrays).
AFFECTED DELPHI VERSIONS
Delphi 3-7 (with the DecisionCube package installed)
WORKAROUND
Add this unit to your project.
-------------------------------------------------------------------------------}
unit DecisionCubeBugWorkaround;
interface
uses Windows, Mxarrays;
implementation
function GetAvailableMem: Integer;
const
MaxInt: Int64 = High(Integer);
var
MemStats: TMemoryStatus;
Available: Int64;
begin
GlobalMemoryStatus(MemStats);
if (MemStats.dwAvailPhys > MaxInt) or (Longint(MemStats.dwAvailPhys) = -1) then
Available := MaxInt
else
Available := MemStats.dwAvailPhys;
if (MemStats.dwAvailPageFile > MaxInt) or (Longint(MemStats.dwAvailPageFile) = -1) then
Inc(Available, MaxInt div 2)
else
Inc(Available, MemStats.dwAvailPageFile div 2);
if Available > MaxInt then
Result := MaxInt
else
Result := Available;
end;
initialization
Mxarrays.SetMemoryCapacity(GetAvailableMem);
end.