Récupération de fichiers à partir du répertoire qui contient une grande quantité de fichiers
J'ai répertoire qui contient près de 14 000 000 d'échantillons audio in *.le format wav.
Tous les plaine de stockage, pas de sous-répertoires.
Je veux boucle à travers les fichiers, mais lorsque j'utilise DirectoryInfo.GetFiles()
sur ce dossier l'ensemble de l'application se fige pendant quelques minutes!
Peut-on le faire d'une autre manière? Peut-être la lecture de 1000, de les traiter, puis prendre la prochaine à 1000 et ainsi de suite?
DirectoryInfo.GetFiles()
est aussi horrible si vous utilisez un réseau SAN. Il bloque tous les fichiers et de blocs que d'autres personnes accèdent récemment créé SAN fichiers. Nous n'avons jamais trouvé un non-blocage de la résolution.- si vous êtes dans une vraie perf critique spot je voudrais également envisager d': stackoverflow.com/questions/724148/...
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé EnumerateFiles méthode de la classe DirectoryInfo?
Comme MSDN Dit
Directory.GetFiles
/Directory.EnumerateFiles
chaîne de retournew DirectoryInfo(dir).getFiles
/new DirectoryInfo(dir).EnumerateFiles
retour FileInfoDans .NET 4.0,
Directory.EnumerateFiles(...)
estIEnumerable<string>
(plutôt que de lastring[]
deDirectory.GetFiles(...)
), de sorte qu'il peut entrées du flux plutôt que de la mémoire tampon d'eux tous; c'est à direvous frapper de la limitation de système de fichiers de Windows lui-même. Lorsque le nombre de fichiers dans un répertoire pousse à un grand nombre (et 14M est bien au-delà de ce seuil), accès à l'annuaire devient incroyablement lent. Il n'a pas vraiment d'importance si vous lisez un fichier à un moment ou 1000, c'est juste l'accès de répertoire.
Une façon de résoudre ce problème est de créer des sous-répertoires et de briser vos fichiers en groupes. Si chaque répertoire a 1000 à 5000 (deviner, mais vous pouvez expérimenter avec des nombres réels), alors vous devriez obtenir des performances décentes ouverture/création/suppression de fichiers.
C'est pourquoi si vous regardez des applications comme Doxygen, qui crée un fichier pour chaque classe, ils suivent ce régime et de tout mettre en 2 niveaux de sous-répertoires qui utilisent des noms aléatoires.
Utilisation de l'Api Win32 FindFile fonctions de le faire sans le blocage de l'application.
Vous pouvez également appeler le Répertoire.GetFiles dans un Système.Le filetage.Tâche (TPL) pour éviter que votre INTERFACE utilisateur à partir du point de congélation.
Profiter.
J'ai touché à cette question de l'accès de gros fichiers dans un seul répertoire beaucoup de temps. Les sous-répertoires sont une bonne option, mais bientôt même ils ne vous aideront pas beaucoup parfois. Ce que je viens de faire est de créer un fichier d'Index (fichier texte avec les noms de tous les fichiers dans le répertoire (à condition que je suis de la création de fichiers dans ce répertoire). J'ai ensuite lu l'indice fichier, puis sur ouvrir, puis réelle fichier à partir du répertoire pour le traitement