procedure RefillSpamarray; //periodically we pull a spam blocks... var ii: byte; zz: byte; jj: LongInt; begin Writeln(logfile, DateTimeToStr(Now)+' STARTING REINITIALIZATION.'); Flush(logfile); ii := Random(3); zz := Random(255); for jj := 0 to SizeOf(fatmass[ii]) do begin fatmass[ii][jj]:=zz; end; Writeln(logfile, DateTimeToStr(Now)+' Refilled block Nr '+IntToStr(ii)+ ' with value= '+ IntToStr(zz)); Flush(logfile); end;
BEGIN Assign(logfile, 'hangup.log'); Append(logfile); Randomize; for i := 0 to 3 do begin //fill four half-gig arrays with rand. databyte z := Random(255); for j := 0 to (SizeOf(fatmass[i])-1) do begin fatmass[i][j]:=z; end; Writeln(logfile, DateTimeToStr(Now)+' Block Nr '+IntToStr(i)+ ' initialized with value= '+ IntToStr(z)); Flush(logfile); end; i:=1; z:=1;
while i <> 0 do begin z:= z * i; if i = 2147483647 then begin RefillSpamarray; i := 1; end; Inc(i); end; END.
Успешно компилится и запускается под Linux (kernel 3.2.0) Однако под виндами (пробовал Xp и Win7 (x32)) выдает:
Что-то мне подсказывает, что хоть динамически, хоть статически выделяй... Общий размер данных только на этом массиве 2 Гб. Если мне память не изменяет, под Windows 32х суммарно под данные и код одного процесса может быть выделено не более 2Gb.
Это про виртуальное адресное пространство, а формат исполняемых файлов почти не изменился по сравнению с Win32 и унаследовал все 32-битные ограничения. Размер статических данных по-прежнему не может превышать 2 ГБ. Поведение компилятора - скажем так, не ошибка, а отсутствие нужных проверок.
Отношусь к AWS как к полной памяти приложения, может потому что программирую на delphi под win32. Может потому, что "out of memory" практически всегда указывает на большую фрагментацию этих адресов, из-за чего нельзя получить большой непрерывный ряд для этих адресов под память.
Ведь все что делается в программе будет доступно через адреса, и вопрос только в том как мы эти адреса распределим.
Кстати, в ошибке, винда написала что приложение "не win32". Т.е. она поняла, может и по формату файла, что приложению может потребоваться больше 2gb памяти. Интересно как поведет себя приложение под win64.
ваше приложение скомпилировано на 64-битный вин. У меня такая ситуация, дома стоял 64-битный ФПС и вин64, на работе компилятор 32 и вин32, прога скомпилированная на win64 не работает на win32. Приходилось код компилировать под 32 и 64. Это не удобно и домашнем удалил 64 и поставил 32-хбитную версию компилятора
ЭЭ, вин64 же, вроде, построен как кросс-компиляция с вин32? У меня стоят оба одновременно, одним батником собираю и 32 и 64. Только в первом случае вызываешь fpc, а во втором ppcrossx64