10
votes

Optimiser la recherche via le grand tableau JS String?

Si j'ai un grand tableau de cordes JavaScript comptant plus de 10 000 éléments, Comment puis-je rechercher rapidement à travers elle?

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.

alors dise que j'ai un tableau de cordes comme:

var descarr = {"Burgers à basculement", "Pompage Gaz", "Livraison de courrier"};

Et l'utilisateur souhaite rechercher: "p"

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 "p" ou "pi" ou une combinaison de lettres, cette recherche partielle signifie que je ne peux pas utiliser de tableaux associatifs (c.-à-d. SearchDescarray ["Pompage Gaz"] ) accélérer la recherche.

Des idées quiconque?


4 commentaires

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 )


5 Réponses :


1
votes

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).

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 .


4 commentaires

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 ...



0
votes

Je suggère d'essayer une fonction JS prête, par exemple le autocomplete de jQuery. C'est rapide et il a de nombreuses options à configurer.

Consultez le JQuery Autocomplete Demo


1 commentaires

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.



21
votes

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:

  • chaîne "Burgers à basculement" "Gaz de pompage" "Livraison de courrier"
  • regex: "([^"] * ping [^ "] *)"

    avec le commutateur / g pour Global, vous obtenez tous les matchs. Assurez-vous que l'utilisateur ne recherche pas votre séparateur de chaîne.

    Vous pouvez même ajouter un identifiant dans la chaîne avec quelque chose comme:

    • String "11 Burgers" 12 Gaz de pompage "" 13 Livraison de courrier "
    • regex: "(\ d +) ([^"] * ping [^ "] *)"

    • Exemple: http://jsfiddle.net/rnabn/4/ (30000 Cordes, limite les résultats à 100)


5 commentaires

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



4
votes

Il n'y a aucun moyen d'accélérer une recherche de tableau 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é. xxx

2.) Mécanique de cache de configuration. xxx

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) xxx

probablement un peu plus de code que vous attendez, mais l'optimalisation et la performance ne vient pas gratuitement. >


1 commentaires

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.



1
votes

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é.

Essayez-le vous-même: http://ebusiness.hopto.org/test/stactest8.htm < / a> (Notez que le temps de création n'est pas pertinent pour la question, c'est-à-dire juste pour obtenir des données pour travailler.)

Une chose que vous puissiez faire de mal à essayer de rendre tous les résultats, ce qui serait un travail assez important lorsque l'utilisateur n'a entré qu'une seule lettre ou une combinaison de lettres courante.


0 commentaires