Firemonkey и большие объемы данных
Я только что посмотрел на реализацию сетки Firemonkey, и оказалось, что это очень простая реализация (всего 1800 строк, что, кажется, немного для реализации сетки). Он практически не выполняет пользовательскую отрисовку, но объединяет множество других элементов управления - что похоже на стиль работы Firemonkey.
Например, каждый столбец содержит массив элементов управления - по одному для каждой ячейки. Для обычного текстового столбца с 1 000 000 строк сетка будет хранить 1 000 000 элементов управления редактированием в памяти - что кажется мне немного сумасшедшим. (РЕДАКТИРОВАТЬ: сейчас не совсем уверен, верно ли это предположение. Кажется, он учитывает видимость ячеек, что может означать, что он обеспечивает что-то вроде виртуального режима, но я не совсем уверен...)
Мой вопрос: без сомнения, этот объединяющий компоненты проект Firemonkey кажется простым и элегантным, но действительно ли он хорошо масштабируется с объемом данных, которые должны отображаться в сетке? Я не могу себе представить, что он хорошо работает с большим количеством строк. Как Firemonkey обрабатывает большие объемы данных?
Спасибо за любой вклад.
1 ответ
Сетка FireMonkey имеет только элементы управления количеством видимых линий. Поэтому, если у вас есть сетка с 10 видимыми строками и 3 столбцами, она создаст 30 элементов управления ячейками. Заполнение сетки с 10.000 записей не проблема: при прокрутке 30 элементов управления ячейки повторно используются и отображаются на новые видимые строки.
И да: я провел несколько тестов с этим, потому что у нас есть сетки TMS с 100.000 записей:-).
Если вы используете OnGetCellText (т.е. не TStringgrid, который очень медленный с большим количеством записей, особенно сетка TMS (основанная на VCL stringgrid)), он очень быстрый (OnGetCellText извлекает данные только видимых ячеек). Мы используем эту технику в сочетании с нашими объектами данных (они уже загружены, поэтому нет необходимости снова заполнять каждую ячейку сетки строковым значением...), и сетки TMS и FMX очень быстрые с 100 000 или более записей!