2013-03-20 9 views
2

Je dispose d'une structure de répertoire importante hébergée sur un périphérique de stockage réseau que je souhaite parcourir en utilisant os.walk. Le système est plutôt lent, mais je pense que le processus pourrait être fait plus rapidement si je pouvais interroger plusieurs répertoires en même temps (tous avec la même racine commune). Je me fiche de savoir dans quel ordre les sorties arrivent, tant que j'ai fini par tout analyser.Parallélisation de os.walk()

Je pense à ré-implémenter os.walk pour passer de nouveaux répertoires dans un pool de travailleurs threads. Je préférerais utiliser le code de quelqu'un d'autre s'il existe déjà (pourquoi réinventer la roue?), Mais je n'en ai rencontré aucun.

Sûrement c'est une tâche commune? Est-ce que quelqu'un a déjà rencontré quelque chose comme ça? Peut-être qu'il me manque quelque chose et que cela n'aboutirait pas à une accélération.

Si je ne reçois pas de réponse dans une semaine environ, je publierai sans doute ma tentative ici.

+1

Vous pourriez déplacer le goulot d'étranglement de votre logiciel vers le matériel. Avez-vous la configuration matérielle et o/s de votre ordinateur pour lire, simultanément, à partir de plusieurs emplacements sur votre périphérique de stockage? Si chacun de vos marcheurs essaie de lire le même canal, la contention entre eux est susceptible de l'emporter sur toute accélération que vous espérez gagner. –

+0

Je ne sais pas trop sur l'infrastructure backend. Le stockage réseau est un grand système d'entreprise, monté comme un partage Samba sur Windows 7. Je suppose qu'il a la capacité d'exécuter plus de requêtes car il est utilisé par des centaines d'utilisateurs en même temps, et que la lenteur est le résultat de latence entre ma machine et le stockage hors site. Si tel est le cas, je pense que soumettre plusieurs requêtes en même temps accélèrera le travail. – Snorfalorpagus

+0

Oui, compte tenu de la description que vous avez faite de votre infrastructure, il semble qu'il y ait au moins le matériel pour plusieurs canaux d'E/S. Sans beaucoup plus de détails, je ne vais pas risquer de deviner la performance de votre approche. Mais, je reste prêt à ne pas être surpris si vous trouvez que plusieurs requêtes simultanées (qui auront toutes la latence que vous mentionnez) ne fonctionnent pas mieux qu'une requête énorme. –

Répondre

1

Il semble que vous ayez besoin d'un système d'exécution de travaux répartis. J'ai travaillé avec Gearman pendant un moment et trouve un cadre génial, si vous ne voulez pas commencer avec le module de base du fil, je le recommanderai. Il prend en charge les clients et les travailleurs écrits en Python, donc peut-être répondre à vos besoins. Mais vous devrez peut-être encore faire le travail de division.

+0

Gearman semble peut-être un peu exagéré pour la tâche que j'ai à l'esprit. – Snorfalorpagus

+0

Eh bien, j'ai aussi peur de ça. Mais honnêtement, l'installation de Gearman pourrait être très rapide, donc ne prend pas trop d'effort. –