Каков наилучший способ реализации массивов переменной длины?

StackOverflow https://stackoverflow.com/questions/283275

  •  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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top