J'écris une servlet qui va examiner un répertoire sur le serveur (externe au conteneur web), et rechercher récursivement certains fichiers (par certains fichiers, je veux dire des fichiers qui sont d'une certaine extension ainsi qu'une certaine convention de nommage). Une fois ces fichiers trouvés, la servlet répond avec une longue liste de tous les fichiers trouvés (y compris le chemin d'accès complet aux fichiers). Mon problème est qu'il y a tellement de fichiers et de répertoires que mon servlet est extrêmement lent. Je me demandais s'il y avait une meilleure pratique ou une servlet existante pour ce type de problème? Serait-il plus efficace de simplement compiler la liste complète des fichiers et de faire le filtrage via js/jquery côté client?Quel est le moyen le plus efficace pour lister tous les fichiers dans un répertoire (y compris les sous-répertoires)?
Répondre
accès disque est lent et que le nombre de fichiers et répertoires augmente, vous rapidement atteindre un point où votre servlet sera inutile lors de l'utilisation de la recherche récursive classique par l'arborescence du répertoire. Vous atteindrez particulièrement cette limite rapidement si vous avez un grand nombre d'utilisateurs simultanés effectuant la même recherche en même temps. Il est préférable d'utiliser un travail par lots externe pour générer la liste des fichiers qui peuvent ensuite être lus dans le servlet via un appel de base de données ou même simplement en analysant un fichier contenant tous les noms de fichiers séparés par un caractère de nouvelle ligne. . L'utilisation de "find" sur Linux est un moyen simple de le faire: par ex.
find <path_to_directory> -name '*.bin' > list_files.txt
Ce serait la liste de tous les noms de fichier qui se termine par .bin dans un répertoire particulier et la sortie dans un fichier nommé list_files.txt. Votre servlet pourrait alors lire dans ce fichier et créer la liste des fichiers à partir de là.
Si vous avez vraiment beaucoup de fichiers, vous pourriez envisager de générer un processus externe pour effectuer la recherche. Si vous utilisez un serveur de type unix (comme linux), vous pouvez obtenir des gains de vitesse en ayant la commande "find" faire la recherche pour vous, et analyser sa sortie.
Vous pouvez google pour de nombreux exemples d'utilisation de "trouver".
Merci beaucoup pour votre réponse! –
Je pense que votre servlet fonctionne lentement à cause de la vitesse du disque dur. si la liste des fichiers d'un permanent vous devez charger la mémoire
Je vois deux raisons possibles pour lesquelles ce processus pourrait aller lentement:
1) E/S disque prend trop de temps. Ce sera une véritable contrainte que vous ne pouvez pas faire grand chose. Habituellement, le système d'exploitation est assez bon pour garder les structures en mémoire qui lui permettent de trouver les fichiers dans vos dossiers beaucoup plus rapidement. Si c'est trop lent, vous devrez peut-être créer un index en mémoire. Tout dépend de la façon dont vous le faites. En tout cas, si c'est le problème (vous pouvez essayer de mesurer), alors il n'y a aucun moyen d'aider le côté client de filtrage, car cela ne devrait pas prendre beaucoup de temps, peu importe où vous le faites. Au lieu de cela, vous allez ralentir le client en lui envoyant plus de données à trier.
2) Il y a un problème avec la traversée de votre répertoire. Vous dites que c'est "récursif". Si vous voulez dire que c'est réellement récursif, c'est-à-dire une méthode qui s'appelle chaque fois qu'il rencontre un nouveau répertoire, alors cela pourrait bien vous ralentir (les frais généraux s'ajoutent vraiment). Il ya quelques trucs sur tree traversal sur wikipedia, mais fondamentalement il suffit d'utiliser une file d'attente ou une pile pour garder une trace de l'endroit où vous êtes dans la traversée, au lieu d'utiliser votre état de méthode pour le faire.
Notez qu'un système de fichiers n'est pas réellement un arbre, mais je suppose que c'est dans ce cas. Ça devient un peu plus poilu autrement.
Je ne suis pas d'accord avec les autres affiches que vous ne pouvez pas mettre en œuvre en cours. Cela devrait fonctionner assez bien jusqu'à un certain point, pas besoin de tâches par lots pour le moment.
Merci pour votre réponse. Je pense qu'un travail par lots est ce que je cherche puisque cette servlet sera utilisée par de nombreux utilisateurs et la liste des fichiers est assez importante (il faut quelques minutes pour tout lister si je fais un simple ls/find sur le serveur) . –
Je vois. trouver est probablement plus rapide que la plupart des choses que vous implémenteriez vous-même. Pourtant, si c'est trop lent et que vous avez plusieurs utilisateurs qui l'interrogent tout le temps, vous allez quand même tuer votre performance, donc je considérerais utiliser des structures en mémoire ou des index plats. – wds
- 1. Dans .Net, quel est le moyen le plus rapide pour trouver récursivement tous les fichiers d'un répertoire racine?
- 2. Quel est le moyen le plus efficace de combiner plusieurs fichiers flash dans un seul film?
- 3. Le moyen le plus efficace pour tester les liens
- 4. Quel est le moyen le plus efficace pour gratter les données d'un site Web (en PHP)?
- 5. Script Shell pour lister récursivement les fichiers les plus volumineux dans un répertoire
- 6. Analyse en Python: quel est le moyen le plus efficace pour supprimer/normaliser les chaînes?
- 7. Quel est le moyen le plus efficace pour restaurer plusieurs bases de données dans SQL 2008
- 8. Quel est le moyen le plus efficace de gérer les rejets "hg import"?
- 9. Lister tous les fichiers ouverts
- 10. Quel est le moyen le plus efficace de compter tous les mots dans une riche zone de texte?
- 11. Quel est le moyen le plus efficace pour supprimer tous les éléments d'un tableau d'un autre tableau?
- 12. quel est le moyen le plus efficace d'écraser bitmapdata
- 13. Quel est l'algorithme purement fonctionnel le plus efficace pour générer tous les préfixes d'une liste?
- 14. En Python, comment trouver tous les fichiers sous un répertoire, y compris les fichiers dans les sous-répertoires?
- 15. Comment obtenir des fichiers dans un répertoire, y compris tous les sous-répertoires
- 16. Le moyen le plus efficace pour créer des fichiers Excel
- 17. Quel est le moyen le plus efficace pour charger mon fichier JPG stocké dans l'ImageView?
- 18. MongoDB: Quel est le moyen le plus efficace pour stocker un chromosome/position
- 19. Quel est le moyen le plus efficace de générer et d'arrêter les processus PHP?
- 20. Quel est le moyen le plus efficace pour obtenir les valeurs les plus élevées et les plus faibles dans un tableau
- 21. Quel est le moyen le plus efficace de détecter les intersections triangle-triangle?
- 22. Quel est le meilleur moyen de lister un membre et tous ses descendants dans MDX?
- 23. Quel est le moyen le plus efficace pour dessiner un grand CGPath?
- 24. Quel est le moyen le plus efficace pour localiser et définir les valeurs d'éléments dans un XDocument?
- 25. Y compris les fichiers source dans C
- 26. Quel est le moyen le plus simple pour télécharger et compiler tous les échantillons de wxWidgets?
- 27. Quel est le moyen le plus efficace pour Deserialze un fichier XML
- 28. Quel est le moyen le plus efficace pour remplir une zone de liste déroulante avec tous les types de fichiers enregistrés (pas seulement les extensions)
- 29. Quel est le sélecteur le plus correct/le plus efficace?
- 30. Quel est le moyen le plus efficace pour créer un système d'ampoule de forum (non lu)?
Belle solution, merci beaucoup! –