2011-10-12 6 views
0

Mon problème est que l'application prend trop de temps à charger des milliers de fichiers. Oui, je sais que ça va prendre du temps, mais je voudrais que ce soit plus rapide. Ce que je veux dire par "charger" est d'ouvrir le fichier pour obtenir son descripteur et ensuite lire les 100 premiers octets ou plus. Donc, ma stratégie principale a été de créer un deuxième thread qui ouvrira et fermera (sans lire aucun contenu) tous les fichiers. Cela semble aider parce que le thread avance devant le thread principal et je suppose que le système d'exploitation cache ces descripteurs de fichiers à l'avance, de sorte que lorsque mon thread principal les ouvre, il s'ouvre rapidement. Cela a effectivement aidé car le thread peut commencer à mettre en cache ces descripteurs de fichier pendant que mon thread principal analyse les données lues depuis ces fichiers.Comment ouvrir et lire des milliers de fichiers très rapidement

Donc, ma vraie question est ... que puis-je faire d'autre pour accélérer les choses? Quelles approches sont là? Quelqu'un at-il eu du succès en faisant cela?

J'ai entendu parler d'appels de préchargement d'OS mais c'était pour les pages de mémoire virtuelle. Y at-il un moyen de dire à l'OS, hé je vais avoir besoin de tous ces fichiers très bientôt - je suggère que vous commencez à les rassembler pour moi à l'avance. Mon fil de lookahead est assez grossier.

Y a-t-il des techniques de disque de bas niveau que je pourrais utiliser? Y a-t-il un modèle d'accès aux fichiers qui pourrait aider? À l'heure actuelle, les fichiers chargés proviennent tous du même dossier. Je suppose qu'il n'y a aucun moyen de déterminer où exactement sur le disque ils mentent et quel ordre d'ouverture du fichier serait le plus rapide pour le disque. Je devine également que le disque a un matériel dur pour rendre ceci aussi efficace comme possible aussi.

Mon application est principalement pour windows, mais des suggestions unix aideraient aussi.

Je programme en C++ si cela fait une différence.

Merci, -julian

Répondre

0

Ma première pensée est que cela va être difficile de travailler autour d'un niveau programmatique. Vous verrez que Linux et OSX peuvent accéder à des milliers de fichiers de ce type en une fraction du temps nécessaire à Windows. Je ne sais pas combien de contrôle vous avez sur la machine. Si vous pouvez conserver les milliers de fichiers sur une partition FAT, vous devriez voir de meilleurs résultats qu'avec NTFS.

À quelle fréquence numérisez-vous ces fichiers et à quelle fréquence changent-ils? Si le ratio est fortement sur le côté lecture, il serait judicieux de copier le début de chaque fichier dans un cache. Le cache peut stocker le nom de fichier, l'heure de modification et 100 octets de chacun des milliers de fichiers.

Questions connexes