Освобождение выделанной памяти

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

01 апр 2009, 09:24

Esgal писал(а):BBB, я тоже думал об этом...
А есть ли вообще способ, адресовать 100 000 строк в Паскале?
Списком, как уже упомянул Naeel Maqsudov.
Разве freemem второй параметр не обязателен?
В Turbo/Borland PAscal обязателен. Это в C этот параметр у аналогичной функции отсутствует.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

02 апр 2009, 10:53

Во-первых, сильно сомневаюсь, что средний размер строки будет порядка 5 символов. Как бы мы не выделяли память, то общий адресуемый свободный кусок будет не более 500К, т.е. за вычетом резидентов, системных таблиц и пр. Как ни крути, но придется задействовать XMS или EMS драйвер для доступа к расширеной памяти, и осуществлять доступ к нужной строке через функцию, которая будет сама управлять подкачкой новых блоков и правкой индексов, как сказал Naeel Maqsudov.
Во-вторых, выделить память заранее для N строк, как было предложено не получится хотя бы потому, что строки имеют разную длину.
И даже создать единую таблицу поинтеров на них будет нерационально, в 64К они явно не поместятся. Однако имеет смысл хранить таблицу вида
[номер_блока_XMS]
[колво_строк_в_блоке]
А в самом блоке локальную таблицу смещений для каждой строки. Это позволит значительно ускорить обращение к нужной строке по сравнению со связаным списком, если конечно не считать времени для подкачки нужного блока из памяти (однако в связаном списке таких подкачек будет еще больше при обращении к строкам, индекс которых далеко от 0). Разумеется должна быть проверка есть ли такой блок уже подкаченный или нет.
Такая таблица кстати может кому то напомнить аппаратную связь GDT/LDT
It's a long way to the top if you wanna rock'n'roll
alexander.spb
Сообщения: 22
Зарегистрирован: 24 мар 2009, 13:25
Откуда: St.Petersburg

02 апр 2009, 11:52

А действительно ли нужно считывать в RAM весь файл?
Если без этого никак -
- определите размер файла;
- выделите блок памяти этого размера;
- считайте его в RAM и обработайте как массив байтов.
Ответить