Как объявить массивы с большим размером индекса?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Как объявить массивы с большим размером индекса?

Сообщение CRobin » 27.03.2017 23:39:56

Здравствуйте. В приложении используются статические массивы с большими индексами, его нужно скомпилировать на одной машине(озу 8гб) для исполнения на другой(озу 64гб). Проблема возникает на этапе компиляции (ОС Windows).
Код: Выделить всё
pattern.lpr(24,1) Fatal: Executable image size is too big for win64 target.


Всего массива два с элементами типа record размером 10млн * 184 и 5млн *144 байтов соответственно. Хотелось бы понять в чем причина ошибки и какого максимального размера массивы я смогу объявить на машине с 64гб озу?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как объявить массивы с большим размером индекса?

Сообщение Дож » 28.03.2017 00:02:08

https://en.wikipedia.org/wiki/2_GB_limit
32-bit processes running on 64-bit Windows are also limited to 2 GB by default, but executables can have a "large address aware" flag set to increase this to 4 GB.


Если статический массив при старте приложения не должен содержать данных, то лучше использовать динамический массив.

Если статический массив при старте приложения содержит данные, то их лучше вынести во внешний файл.

Если оба варианта не подходят, то исхитряться. Жать данные, либо искать как в fpc включить упомянутый выше флаг, либо ещё как-то.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 661
Зарегистрирован: 12.10.2008 16:14:47

Re: Как объявить массивы с большим размером индекса?

Сообщение CRobin » 28.03.2017 00:43:52

Пробовал компиляцию с ключем {$SetPEFlags $20} но результата нет. Не подскажете, как именно включать опцию "large address aware" правильно? Lazarus 2.6.4
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как объявить массивы с большим размером индекса?

Сообщение SSerge » 28.03.2017 04:53:03

CRobin писал(а):как именно включать опцию "large address aware"


Вам компилятор говорит, что размер файла .exe получается физически больше обслуживаемого предела.
Однако, вы упорно пытаетесь найти и включить опцию, относящуюся к адресации. :shock:

Сказано ж коллегами:

- использовать динамический массив вместо статики
- вынести массив данных, если таковые есть, отдельным файлом
SSerge
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Как объявить массивы с большим размером индекса?

Сообщение zub » 28.03.2017 06:12:40

Код: Выделить всё
{$IFDEF WINDOWS}
{$IFDEF FPC}
  {$IFDEF CPU32}
   {$setpeflags $20} //winnt.h:#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // App can handle >2gb addresses
  {$ENDIF}
{$ENDIF}
{$ENDIF}

Но к ошибке это отношение не имеет.

Дож,SSerge
+1

CRobin
Разворачивай "гиганские" структуры данных в рантайме
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: Как объявить массивы с большим размером индекса?

Сообщение serbod » 28.03.2017 11:13:05

Для таких объемов нужны не массивы, а деревья.

Грубо говоря, если вы сложите 10 миллионов файлов в одну папку, то ее очень сложно будет прочесть. Но если разбить файлы по папкам, то получится примерно 3162 папок по 3163 файла, что не так уж и сложно для чтения.

Если разбить по папкам на 3 уровня, то в каждой папке будет всего 216 папок или 216 файлов. Вообще ерунда.
Аватара пользователя
serbod
постоялец
 
Сообщения: 108
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Как объявить массивы с большим размером индекса?

Сообщение CRobin » 28.03.2017 23:03:25

Напрямую решить проблему не удалось, пришлось переписать логику для работы с динамическими массивами. Буду наедятся, что никаких подводных камней это за собой не повлечет. Всем спасибо за советы.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 2

Рейтинг@Mail.ru