Voici quelques optimisations que vous pouvez appliquer pour accélérer les choses. Je pense juste à haute voix.
Étant donné que le nombre de lignes peut être de plusieurs millions, vous souhaiterez un système de mise en cache uniquement pour les données JSON du serveur. Je ne peux pas imaginer que quelqu'un veuille télécharger tous les X millions d'articles, mais s'ils le faisaient, ce serait un problème. Ce petit test sur Chrome pour un tableau sur 20M + entiers plante en permanence sur ma machine.
var data = [];
for(var i = 0; i < 20000000; i++) {
data.push(i);
}
console.log(data.length);
Vous pouvez utiliser LRU ou un autre algorithme de mise en cache et avoir une limite supérieure sur la quantité de données que vous êtes prêt à mettre en cache.
Pour les cellules du tableau elles-mêmes, je pense que la construction / destruction de nœuds DOM peut être coûteuse. Au lieu de cela, vous pouvez simplement prédéfinir le nombre X de cellules, et chaque fois que l'utilisateur fait défiler vers une nouvelle position, injectez les données JSON dans ces cellules. La barre de défilement n'aurait pratiquement aucune relation directe avec l'espace (hauteur) requis pour représenter l'ensemble de données entier. Vous pouvez définir arbitrairement la hauteur du conteneur de table, disons 5000 px, et la mapper au nombre total de lignes. Par exemple, si la hauteur des conteneurs est de 5000 pixels et qu'il y a un total de 10 millions de lignes, alors starting row ≈ (scroll.top/5000) * 10M
où scroll.top
représente la distance de défilement à partir du haut du conteneur. Petite démo ici .
Pour détecter quand demander plus de données, idéalement, un objet doit agir comme un médiateur qui écoute les événements de défilement. Cet objet garde une trace de la vitesse de défilement de l'utilisateur, et lorsqu'il semble que l'utilisateur ralentit ou s'est complètement arrêté, effectue une demande de données pour les lignes correspondantes. La récupération de données de cette manière signifie que vos données vont être fragmentées, donc le cache doit être conçu dans cet esprit.
Les limites du navigateur sur le nombre maximal de connexions sortantes peuvent également jouer un rôle important. Un utilisateur peut faire défiler jusqu'à une certaine position qui déclenchera une demande AJAX, mais avant cela, l'utilisateur peut faire défiler jusqu'à une autre partie. Si le serveur ne répond pas suffisamment, les demandes seront mises en file d'attente et l'application ne répondra pas. Vous pouvez utiliser un gestionnaire de demandes par lequel toutes les demandes sont acheminées et il peut annuler les demandes en attente pour libérer de l'espace.