Si j'ai un grand tableau de cordes JavaScript comptant plus de 10 000 éléments, Comment puis-je rechercher rapidement à travers elle? P>
En ce moment, j'ai un tableau de chaîne JavaScript qui stocke la description d'un emploi, et je "m" m Autoriser à l'utilisateur à filtrer dynamique la liste renvoyée en saisissant une zone d'entrée. P>
alors dise que j'ai un tableau de cordes comme: Et l'utilisateur souhaite rechercher: Comment puis-je rechercher une matrice de chaîne qui contient plus de 10000 des descriptions?
Évidemment, je ne peux pas trier le tableau de description car ils sont des descriptions, une recherche binaire est donc sortie. Et puisque l'utilisateur peut rechercher par Des idées quiconque? p>
var descarr = {"Burgers à basculement", "Pompage Gaz", "Livraison de courrier"}; Code> P>
"p" code> p>
"p" code> ou "pi" code> ou une combinaison de lettres, cette recherche partielle signifie que je ne peux pas utiliser de tableaux associatifs (c.-à-d. SearchDescarray ["Pompage Gaz"] Code>)
accélérer la recherche. p>
5 Réponses :
Cela peut ne pas être une réponse pour vous, car je fais des hypothèses sur votre configuration, mais si vous avez du code côté serveur et une base de données, vous seriez bien mieux de faire un rappel Ajax pour obtenir la coupe Down List of Résultats et utilise une base de données pour faire le filtrage (comme ils sont très bons à ce genre de chose). P>
Ainsi que la prestation de la base de données, vous bénéficierez également de ne pas émettre de nombreuses données (10000 variables) à une extrémité frontale basée sur le Web - si vous ne renvoyez que celles que vous avez besoin, vous économiserez un peu de bande passante . p>
Une base de données aurait besoin d'un indice FUNTLEXTEXT pour convenir à cet emploi, ce qui n'est pas quelque chose que des bases de données implémentent par défaut, car elle coûte beaucoup de stockage / mémoire. Il peut toujours être plus rapide d'utiliser une base de données normale simplement car elle exécute un code de manière significative plus rapide que le navigateur pire des cas IE6, mais s'il doit gérer beaucoup d'utilisateurs, il doit être un index spécialisé.
@ebusiness - Un index complet de texte ne serait pas requis pour cela. Sur SQL Server, une requête avec le titre de 'p%' serait toujours sargable et utiliserait un index sur cette colonne si l'on était présent. Il est également plus rapide car vous ne transmettez pas tous les 10000 sur le fil au client avant le traitement, seule la liste de réduction.
Après avoir pensé pendant 3 ans, c'est votre meilleure réplique? % P% n'est pas sargable, et je pense que c'est ce que l'Asseract voulait.
Drôle, il suffit de recevoir un rapport de ce commentaire hier ...% p% n'est pas sargable, mais je crois que p% est. Pensez à vous quand j'ai lu la question à nouveau, je vois que je me trompe ...
Je suggère d'essayer une fonction JS prête, par exemple le Consultez le JQuery Autocomplete Demo P> autocomplete code> de jQuery. C'est rapide et il a de nombreuses options à configurer. P>
Salut médopal, merci pour la suggestion, mais jQuery autocomplete n'est que rapide quand il y a relativement peu d'entrées, quand dans l'ordre de 10k +, il devient lent aussi bien.
Comme les moteurs d'expression réguliers dans les navigateurs réels vont des noix en termes de vitesse, que diriez-vous de le faire de cette façon? Au lieu d'un tableau passez une chaîne gigantesque et séparez les mots avec un identificateur. Exemple: p>
"Burgers à basculement" "Gaz de pompage" "Livraison de courrier" Code> Li>
- regex:
"([^"] * ping [^ "] *)" code> li>
ul>
avec le commutateur / g code> pour Global, vous obtenez tous les matchs. Assurez-vous que l'utilisateur ne recherche pas votre séparateur de chaîne. P>
Vous pouvez même ajouter un identifiant dans la chaîne avec quelque chose comme: p>
- String
"11 Burgers" 12 Gaz de pompage "" 13 Livraison de courrier " Code> Li>
-
regex: "(\ d +) ([^"] * ping [^ "] *)" code> p> l> p> LI>
-
Exemple: http://jsfiddle.net/rnabn/4/ (30000 Cordes, limite les résultats à 100) p> li>
ul>
La performance n'est pas tellement sur les navigateurs modernes que les habitudes de matériel et d'utilisateurs. Dans la vie réelle, 2 Go de RAM pour l'ordinateur d'un utilisateur moyen donne un résultat différent par rapport à une machine d'un développeur chevronné. Les gens gardent leurs ordinateurs en bonne forme.
Les auteurs d'expression régulière modernes sont presque aussi rapides qu'un programme C ++ précompilé. Il y a des mondes de performance entre l'ancien JavaScript (Firefox 2 / Netscape / Internet Explorer) et les nouvelles implémentations juste à temps. JavaScript sur un PC moyen avec chrome exécute plusieurs fois plus vite, puis JavaScript sur un PC Highend avec Internet Explorer.
Juste comme une tête à des futurs violoneux. Lors de la modification de votre exemple de jsfiddle pour accepter également le numéro d'identification, le caractère numérique doit être double-échappé: nouvelle REGEXP ('"(\\ d +) ([^"] *' + recherche + '[^ "] *)" " gi ')
Salut pouvez-vous s'il vous plaît dites-moi comment convertir un grand tableau en "gigantes string" dans votre plumbler merci, je vais donner un uppote si vous m'aidez, votre réponse est agréable sans doute, mais la convertir une matrice prendra également du temps, pouvez-vous fournir un peu de temps. démo?
@Sudarshan GIST.GITUB.COM/SOD/B05F36FC2DE48621686FBCDBAAD634DB
Il n'y a aucun moyen d'accélérer une recherche de tableau forte> for forte> sans apporter des changements. Vous pouvez accélérer les recherches continues en mettant en cache les résultats et les cartographier de manière dynamique des motifs.
1.) Ajustez votre format de données. Cela rend les recherches initiales un peu plus rapides. Fondamentalement, vous avez corrigé. P> 2.) Mécanique de cache de configuration. P> 3.) Utilisez le script suivant pour Créez un objet de correction de correction. Je vous suggère de courir cette fois et d'utiliser JSON.Stringify pour créer un objet de cache statique. (ou faire ceci sur le backend) p> probablement un peu plus de code que vous attendez, mais l'optimalisation et la performance ne vient pas gratuitement. P> P> P> P> >
Je suis intrigué par ce mécanisme de recherche. Cependant, je suis confondu de la raison pour laquelle vous ne prévenez que chaque lettre? Cette méthode met-elle également en cache des mots entiers? Dites que vous souhaitez rechercher 'batte' dans un tableau de 20 000 chaînes.
Je ne peux pas reproduire le problème, j'ai créé une implémentation naïve et la plupart des navigateurs font la recherche sur 10000 15 chaînes de caractères dans un seul chiffre de millisecondes. Je ne peux pas tester dans IE6, mais je ne le croirais pas à plus de 100 fois plus lent que les navigateurs les plus rapides, ce qui serait toujours pratiquement instantané. P>
Voulez-vous faire correspondre la recherche au début des ficelles ou des chaînes à l'intérieur? Si la recherche de l'utilisateur de "P", il devrait-il inclure "Burgers à basculement" dans le résultat?
Descarr n'est pas un tableau mais un objet littéral.
@guffa, oui, si l'utilisateur cherche "P", il devrait inclure "Burgers à basculement" dans le résultat. Je trouve que le plus grand ralentissement en ce moment est la recherche réelle. Actuellement, j'ai une forloop qui compte sur la matrice et cette comparaison: si (Descarray [I] .Search ("P"))> -1) {// résultat de retour}
Faites-le avec REGEXP - Exemple: jsfiddle.net/rnabn/4 (30k Strings, max 100 résultats )