Oto kilka optymalizacji, które możesz zastosować, aby przyspieszyć działanie. Po prostu myślę głośno.
Ponieważ liczba wierszy może być w milionach, potrzebny będzie system buforowania tylko dla danych JSON z serwera. Nie wyobrażam sobie, że ktoś chciałby pobrać wszystkie X milionów elementów, ale gdyby to zrobił, byłby to problem. Ten mały test w Chrome dla tablicy na liczbach całkowitych 20 M + stale się zawiesza na moim komputerze.
var data = [];
for(var i = 0; i < 20000000; i++) {
data.push(i);
}
console.log(data.length);
Możesz użyć LRU lub innego algorytmu buforowania i mieć górną granicę ilości danych, które chcesz buforować.
Myślę, że w przypadku samych komórek tabeli budowanie / niszczenie węzłów DOM może być kosztowne. Zamiast tego możesz po prostu wstępnie zdefiniować liczbę komórek X i za każdym razem, gdy użytkownik przewinie do nowej pozycji, wstrzyknij dane JSON do tych komórek. Pasek przewijania nie miałby praktycznie żadnego bezpośredniego związku z ilością miejsca (wysokości) wymaganego do przedstawienia całego zestawu danych. Możesz dowolnie ustawić wysokość kontenera tabeli, powiedzmy 5000px, i odwzorować ją na całkowitą liczbę wierszy. Na przykład, jeśli wysokość kontenerów wynosi 5000 pikseli, a w sumie jest 10 mln wierszy, to starting row ≈ (scroll.top/5000) * 10M
gdzie scroll.top
oznacza odległość przewijania od góry kontenera. Małe demo tutaj .
Aby wykryć, kiedy zażądać więcej danych, najlepiej obiekt powinien działać jako mediator, który nasłuchuje przewijanych zdarzeń. Ten obiekt śledzi szybkość przewijania przez użytkownika, a gdy wygląda na to, że użytkownik zwalnia lub całkowicie się zatrzymał, wysyła żądanie danych dla odpowiednich wierszy. Odzyskiwanie danych w ten sposób oznacza, że dane zostaną pofragmentowane, dlatego pamięć podręczna powinna być zaprojektowana z myślą o tym.
Ważną rolę mogą również odgrywać ograniczenia przeglądarki dotyczące maksymalnej liczby połączeń wychodzących. Użytkownik może przewinąć do określonej pozycji, która uruchomi żądanie AJAX, ale zanim to się skończy, użytkownik może przewinąć do innej części. Jeśli serwer nie reaguje wystarczająco, żądania zostaną umieszczone w kolejce, a aplikacja nie będzie odpowiadać. Możesz użyć menedżera żądań, przez który wszystkie żądania są kierowane, i może anulować oczekujące żądania, aby zwolnić miejsce.