Каков наилучший способ реализации массивов переменной длины?
-
08-07-2019 - |
Вопрос
Я хочу сохранить большой результирующий набор из базы данных в памяти.Каждая запись имеет переменную длину, и время доступа должно быть таким же быстрым, как у массивов.Каков наилучший способ реализовать это?Я думал о том, чтобы сохранить смещения в отдельной таблице и хранить все записи последовательно?Разве это странно?(Язык программирования:Дельфы)
Решение
Не уверен, что я полностью вас понимаю, но взгляните на TList.
По крайней мере, в Delphi 7 это реализовано как набор указателей.Вы можете использовать свойство capacity для предварительного распределения списка заранее, если знаете, сколько результатов будет возвращено.
Список будет автоматически увеличиваться, если в нем не хватит места.На сколько он вырастет, зависит от того, насколько велик список.
Взгляните на исходный код модуля classes, чтобы увидеть, что он делает.
Редактировать:Также в D2009 в TList была добавлена поддержка genric, что делает его немного приятнее в использовании.
Другие советы
Лучше всего, вероятно, содержать массив указателей на записи. В этом случае вам не придется иметь дело со смещениями, а поиск будет постоянным.
Почему бы не использовать версию вашей базы данных MEMORY? У большинства есть способ сохранить полную таблицу в памяти, обычно используя ключевое слово SQL MEMORY. Вы скопируете таблицу с диска в таблицу памяти, а затем сможете использовать все обычные операции с базой данных на скорости памяти. Я знаю, что это хорошо работает в DBISAM.
Следуя mj2008 , вы можете использовать TCLientDataset вместо массива записей. Насколько велик этот набор результатов?
Я бы использовал TList и сохранял указатели на вашу запись.
type
pMyRecord : ^TMyRecord;
...
...
...
var
p : pMyRecord;
...
...
New(p);
with p^ do
begin
...
...
end;
...
MyList.Add(P);