Est-il possible d'accélérer Python IO?
Considérer ce programme en python:
import sys
lc = 0
for line in open(sys.argv[1]):
lc = lc + 1
print lc, sys.argv[1]
À le faire fonctionner sur mon 6GB fichier texte, il termine en ~ 2minutes.
Question: est-il possible d'aller plus vite?
Noter que la même temps est requis par:
wc -l myfile.txt
donc, je soupçonne que la réponse à ma quesion est juste un simple "non".
Remarque aussi que mon programme est en train de faire quelque chose de plus intéressant que de simplement compter les lignes, donc merci de donner une réponse générique, pas ligne de comptage-astuces (comme garder un nombre de lignes de métadonnées dans le fichier)
PS: j'ai marqué "linux" à cette question, parce que je suis intéressé seulement dans linux-des réponses précises. N'hésitez pas à donner OS-agnostique, ou même d'autres-OS réponses, si vous en avez.
Voir aussi la question de suivi
source d'informationauteur Davide
Vous devez vous connecter pour publier un commentaire.
On ne peut aller plus vite que le disque maximum de la vitesse de lecture.
Afin d'atteindre le maximum de vitesse de disque vous pouvez utiliser les deux conseils suivants:
Jeter le matériel sur le problème.
Que gs a souligné, le goulot d'étranglement est le disque dur le taux de transfert. Donc, non, vous ne pouvez pas utiliser un meilleur algorithme pour améliorer votre temps, mais vous pouvez acheter un disque dur plus rapide.
Edit: un Autre bon point par gs; vous pouvez également utiliser un RAID de configuration pour améliorer votre vitesse. Cela peut être fait soit avec matériel ou d'un logiciel (par exemple,OS XLinuxWindows Serveretc).
Équations Régissant
(Amount to transfer) /(transfer rate) = (time to transfer)
(6000 MB) /(60 MB/s) = 100 seconds
(6000 MB) /(125 MB/s) = 48 seconds
Solutions Matérielles
Le ioDrive Duo est censé être la solution la plus rapide pour l'environnement de l'entreprise, et "sera disponible en avril 2009".
Ou vous pouvez vérifier le disque dur WD Velociraptor (10 000 tr /min).
Aussi, j'entends le Seagate Le guépard est une bonne option (15 000 tr /min, forte de 125 MO/s taux de transfert).
L'astuce est de ne pas faire les électrons se déplacent plus vite (c'est dur à faire), mais pour obtenir plus de travail par unité de temps.
Tout d'abord, assurez-vous que votre 6GB le fichier lu est dépendant des e/S, pas de CPU.
Si C'est I/O bound, considérer le "Fan-Out" modèle de conception.
Un parent processus génère un tas d'enfants.
Le parent lit le 6 gb de fichiers, et traite les lignes de la main aux enfants par écrit à leur STDIN tuyaux. Le 6 GBITS le temps de lecture restant constant. La ligne traitant doit impliquer un peu parent de traitement possible. Très simple, les filtres ou les chiffres doivent être utilisés.
Un canal est un canal de mémoire pour la communication. C'est une mémoire tampon partagée avec un lecteur et un écrivain.
Chaque enfant lit une ligne sur l'entrée standard, et ne de travail appropriés. Chaque enfant devrait probablement écrire un simple fichier de disque avec la finale (résumé, réduire) les résultats. Plus tard, les résultats de ces fichiers peuvent être consolidés.
simple "non".
Vous avez à peu près atteint le maximum de la vitesse du disque.
Je veux dire, vous pourriez mmap le fichier ou le lire en binaire morceaux, et l'utilisation
.count('\n')
ou quelque chose. Mais c'est peu probable pour donner de grandes améliorations.Si l'on suppose qu'un disque peut le lire à 60 mo/s vous auriez besoin 6000 /60 = 100 secondes, 1 minute 40 secondes. Je ne pense pas que vous pouvez obtenir plus rapidement parce que le disque est le goulot d'étranglement.
Noter que Python I/O est implémenté en C, donc il n'y a pas beaucoup de chance de l'excès de vitesse vers le haut encore.
comme d'autres l'ont m'a dit "non"
Quasi-totalité de votre temps à attendre pour IO. Si c'est quelque chose que vous avez besoin de faire plus d'une fois, et vous avez une machine avec des tonnes de ram, vous pouvez garder le fichier en mémoire. Si votre machine dispose de 16 go de mémoire vive, vous aurez 8 GO disponible dans /dev/shm pour jouer avec.
Une autre option:
Si vous avez plusieurs machines, ce problème est facile à paralléliser. Split de l'entre plusieurs ordinateurs, chacun d'entre eux comptent leurs retours à la ligne, et ajouter les résultats.
2 minutes de sons sur la droite pour lire un ensemble de 6 go de fichiers. Il n'y a pas vraiment beaucoup que vous pouvez faire pour l'algorithme ou l'OS pour accélérer les choses. Je pense que vous avez deux options:
Jeter de l'argent sur le problème et d'obtenir un meilleur matériel. Probablement la meilleure option si ce projet est pour votre travail.
Ne pas lire le fichier entier. Je ne sais pas ce que vous essayez de faire avec les données, donc peut-être que vous n'avez pas une option, mais à lire l'ensemble de la chose. D'autre part, si vous êtes à la numérisation de l'ensemble du dossier pour une chose en particulier, alors peut-être mettre un peu de métadonnées là au début serait utile.