При работе с большими объемами данных в программах на Delphi важно обеспечить эффективное чтение информации, чтобы избежать задержек и повышенного потребления памяти. В данной статье мы рассмотрим методы оптимизации процесса чтения данных из таблиц, содержащих более 5 миллионов записей, каждая из которых включает три строковых поля и восемь полей с плавающей точкой, без использования индексов и первичных ключей.
Исходное состояние
Исходно, при открытии таблицы с 5 миллионами записей, процесс занимает 33 секунды и использует 1,254,584 кБ памяти. При попытке прокрутки данных время выполнения увеличивается до бесконечности, при этом увеличение выделенной памяти в Task Manager не наблюдается.
Оптимизация с использованием DataSet
Применение свойства DisableControls уменьшает время прокрутки до 13,7 секунд, но общее время выполнения увеличивается до 46,7 секунд, и память остается на уровне 1,254,584 кБ.
Применение серверного курсора
Установка свойства CursorLocation в значение clUseServer позволяет открыть таблицу мгновенно и сократить время прокрутки до 19,4 секунд, при этом уменьшая использование памяти до 56 кБ. Однако, общее время выполнения остается на уровне 19,4 секунды с небольшим отрицательным значением использования памяти из-за округления.
Замораживание данных
Использование свойства LockType с значением ltReadOnly дает схожий результат с использованием серверного курсора, с небольшим уменьшением времени прокрутки до 18,4 секунды и использованием памяти в 0 кБ.
Настройка кэша
Установка свойства CacheSize в значение 100 позволяет сократить время доступа к данным до 11,4 секунд с использованием памяти всего в 432 кБ, что является наилучшим результатом среди рассмотренных вариантов.
Пробные изменения
Также были проверены свойства CursorLocarion, IsolationLevel, Mode, CursorType и BlockReadSize компонента Connection, а также компонентов TADOTable, TADOQuery и TADODataSet, но изменения, внесенные ими, не оказали заметного влияния.
Выбор компонентов ADO
При использовании компонентов TADOTable и TADOQuery была замечена более высокая производительность по сравнению с TADODataSet, что противоречит мнению Джерри в комментариях здесь.
Настройка кэша
Важно отметить, что оптимальное значение свойства CacheSize зависит от конкретного случая использования, и увеличение значения кэша не всегда приводит к улучшению производительности.
Пример кода
with TADOTable do
begin
DisableControls := True;
CursorLocation := clUseServer;
LockType := ltReadOnly;
CacheSize := 100; // Оптимальное значение может отличаться в зависимости от задачи
end;
В заключение, при работе с большими объемами данных в Delphi важно тщательно подходить к настройке компонентов данных, включая кэширование и использование серверного курсора. Это позволит добиться значительного ускорения работы программы и уменьшения потребления памяти.
Ускорение работы с данными в Delphi путем оптимизации чтения из больших таблиц, включая использование серверного курсора и настройки кэша.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS