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