У меня есть выбор.
У меня есть ряд уже упорядоченных строк, которые мне нужно сохранить и получить. Похоже, я могу выбирать между использованием:
- TStringList
- Динамический массив строк и
-
Связанный список строк (односвязный)
и Алан в своем комментарии предложил мне также добавить к выборам:
-
TList<string>
В каких обстоятельствах каждый из них лучше других?
Что лучше для небольших списков (менее 10 элементов)?
Что лучше для больших списков (более 1000 элементов)?
Что лучше для огромных списков (более 1 000 000 предметов)?
Что лучше всего свести к минимуму использование памяти?
Что лучше всего минимизировать время загрузки для добавления дополнительных элементов в конец?
Что лучше всего минимизировать время доступа для доступа ко всему списку от первого до последнего?
На этой основе (или любых других), какая структура данных предпочтительнее?
Для справки, я использую Delphi 2009.
Димитрий в комментарии сказал:
Опишите свою задачу и шаблон доступа к данным, тогда вы сможете дать вам точный ответ
Хорошо. У меня есть генеалогическая программа с большим количеством данных.
Для каждого человека у меня есть несколько событий и атрибутов. Я храню их как короткие текстовые строки, но их много для каждого человека, от 0 до нескольких сотен. И у меня тысячи людей. Мне не нужен случайный доступ к ним. Мне нужно, чтобы они были связаны как число строк в известном порядке, прикрепленном к каждому человеку. Это мой случай с тысячами "небольших списков". Они занимают время для загрузки и использования памяти и требуют времени для доступа, если мне все они нужны (например, для экспорта всего сгенерированного отчета).
Затем у меня есть несколько более крупных списков, например. все имена разделов моего "виртуального" дерева, которые могут иметь сотни тысяч имен. Опять мне нужен только список, к которому я могу получить доступ по индексу. Они сохраняются отдельно от древовидной структуры для повышения эффективности, а treeview извлекает их только по мере необходимости. Это занимает некоторое время, чтобы загрузить и очень дорого для памяти для моей программы. Но мне не нужно беспокоиться о времени доступа, потому что только несколько из них получают доступ за раз.
Надеюсь, это даст вам представление о том, чего я пытаюсь выполнить.
p.s. Я поставил много вопросов об оптимизации Delphi здесь, в StackOverflow. Моя программа считывает файлы размером 25 МБ со 100 000 человек и создает для них структуры данных, отчет и древовидную структуру за 8 секунд, но для этого используется 175 МБ ОЗУ. Я работаю над тем, чтобы уменьшить это, потому что я нацелен на загрузку файлов с несколькими миллионами человек в 32-разрядной Windows.
Я только что нашел отличные рекомендации по оптимизации TList в этом вопросе StackOverflow: Есть ли более быстрая реализация TList?