Вот несколько оптимизаций, которые вы можете применить, чтобы ускорить процесс. Просто мысли вслух.
Поскольку число строк может быть в миллионах, вам понадобится система кеширования только для данных JSON с сервера. Я не могу представить, чтобы кто-то захотел загрузить все X миллионов предметов, но если бы они это сделали, это было бы проблемой. Этот небольшой тест на Chrome для массива из 20M + целых чисел постоянно вылетает на моей машине.
var data = [];
for(var i = 0; i < 20000000; i++) {
data.push(i);
}
console.log(data.length);
Вы могли бы использовать LRU или какой-либо другой алгоритм кэширования и иметь верхнюю границу того, сколько данных вы готовы кешировать.
Я думаю, что для самих ячеек таблицы создание / уничтожение DOM-узлов может быть дорогостоящим. Вместо этого вы можете просто предварительно определить число ячеек X, и всякий раз, когда пользователь прокручивает до новой позиции, вставляет данные JSON в эти ячейки. Полоса прокрутки практически не имеет прямого отношения к тому, сколько места (высоты) требуется для представления всего набора данных. Вы можете произвольно установить высоту контейнера таблицы, скажем, 5000 пикселей, и сопоставить ее с общим числом строк. Например, если высота контейнеров составляет 5000 пикселей, а общее количество строк составляет 10 мегабайт, то значение starting row ≈ (scroll.top/5000) * 10M
where scroll.top
представляет расстояние прокрутки от верхней части контейнера. Небольшая демонстрация здесь .
Чтобы определить, когда запрашивать больше данных, в идеале объект должен действовать как посредник, который прослушивает события прокрутки. Этот объект отслеживает, как быстро пользователь выполняет прокрутку, и когда он выглядит так, как будто пользователь замедляется или полностью остановился, выполняет запрос данных для соответствующих строк. Получение данных таким способом означает, что ваши данные будут фрагментированы, поэтому кэш должен быть спроектирован с учетом этого.
Кроме того, ограничения браузера на максимальное количество исходящих соединений могут сыграть важную роль. Пользователь может прокрутить до определенной позиции, которая вызовет AJAX-запрос, но до того, как это закончится, пользователь может перейти к другой части. Если сервер недостаточно отзывчив, запросы будут поставлены в очередь, и приложение будет выглядеть не отвечающим. Вы можете использовать диспетчер запросов, через который маршрутизируются все запросы, и он может отменить ожидающие запросы, чтобы освободить место.