Hier sind einige Optimierungen, die Sie anwenden können, um die Dinge zu beschleunigen. Ich denke nur laut nach.
Da die Anzahl der Zeilen in Millionenhöhe liegen kann, benötigen Sie ein Caching-System nur für die JSON-Daten vom Server. Ich kann mir nicht vorstellen, dass jemand alle X Millionen Artikel herunterladen möchte, aber wenn dies der Fall wäre, wäre dies ein Problem. Dieser kleine Test in Chrome für ein Array mit mehr als 20 Millionen Ganzzahlen stürzt auf meinem Computer ständig ab.
var data = [];
for(var i = 0; i < 20000000; i++) {
data.push(i);
}
console.log(data.length);
Sie können LRU oder einen anderen Caching-Algorithmus verwenden und eine Obergrenze dafür festlegen, wie viele Daten Sie zwischenspeichern möchten.
Für die Tabellenzellen selbst halte ich das Erstellen / Zerstören von DOM-Knoten für teuer. Stattdessen können Sie einfach die X-Anzahl von Zellen vordefinieren und die JSON-Daten in diese Zellen einfügen, wenn der Benutzer zu einer neuen Position blättert. Die Bildlaufleiste hat praktisch keine direkte Beziehung dazu, wie viel Platz (Höhe) erforderlich ist, um den gesamten Datensatz darzustellen. Sie können die Höhe des Tabellencontainers beliebig festlegen, z. B. 5000 Pixel, und diese der Gesamtzahl der Zeilen zuordnen. Wenn die Containerhöhe beispielsweise 5000 Pixel beträgt und insgesamt 10 Millionen Zeilen vorhanden sind, gibt das starting row ≈ (scroll.top/5000) * 10M
Wo scroll.top
den Bildlaufabstand vom oberen Rand des Containers an. Kleine Demo hier .
Um zu erkennen, wann weitere Daten angefordert werden müssen, sollte ein Objekt idealerweise als Vermittler fungieren, der auf Bildlaufereignisse wartet. Dieses Objekt verfolgt, wie schnell der Benutzer einen Bildlauf durchführt, und stellt eine Datenanforderung für die entsprechenden Zeilen, wenn es so aussieht, als würde der Benutzer langsamer oder vollständig angehalten. Das Abrufen von Daten auf diese Weise bedeutet, dass Ihre Daten fragmentiert werden. Daher sollte der Cache unter diesem Gesichtspunkt gestaltet werden.
Auch die Browserbeschränkungen für maximal ausgehende Verbindungen können eine wichtige Rolle spielen. Ein Benutzer kann zu einer bestimmten Position scrollen, die eine AJAX-Anforderung auslöst, aber bevor dies abgeschlossen ist, kann der Benutzer zu einem anderen Teil scrollen. Wenn der Server nicht ausreichend reagiert, werden die Anforderungen in die Warteschlange gestellt und die Anwendung reagiert nicht mehr. Sie können einen Anforderungsmanager verwenden, über den alle Anforderungen weitergeleitet werden, und ausstehende Anforderungen abbrechen, um Speicherplatz zu schaffen.