2010-07-06 5 views
-3

Combien de temps faut-il pour diffuser un fichier de 1 Go en python sur une machine Intel Core 2 Duo de 2 GHz, par exemple?Diffusion d'un fichier de 1 Go en Python

fp = open('publisher_feed_8663.xml') 
for line in fp: 
    a = line.split('<') 

Je suppose que je n'étais pas assez spécifique. Ce processus prend plus de 20 minutes, ce qui est anormalement long. Basé sur des données empiriques, qu'est-ce qu'un temps raisonnable?

+0

Besoin de plus de spécifications. La vitesse du disque dur est importante. "Combien de temps cela devrait-il prendre?" Utilisez des données empiriques. – mcandre

+0

La question ici n'est pas "combien de temps" mais "combien de mémoire, voire pas du tout possible". - Ok, 1 Go est dans la limite de taille pour les chaînes Python, donc toutes les opérations devraient être possibles. 10 Go de données sont cependant trop nombreux pour une chaîne Python à gérer. Soyez très prudent. – badp

+0

Quel est le système de fichiers dans lequel le fichier est stocké? Cela peut faire une énorme différence dans la performance attendue. Comme un exercice de réflexion, envisager les options suivantes: disque RAM, SCSI, SATA, PATA, HDD externe sur UBS2, raid externe sur USB2, clé USB, raid externe sur la connexion 10Gb, et ainsi de suite. –

Répondre

1

Cela dépend entièrement de ce qu'il y a dans le fichier. Vous lisez une ligne à la fois, ce qui signifie une charge de frais généraux appelant l'itérateur encore et encore pour le cas courant de beaucoup de lignes courtes. Utilisez fp.read(CHUNK) avec un grand nombre pour CHUNK pour améliorer les performances.

Cependant, je ne suis pas sûr de ce que vous faites avec split('<'). Vous ne pouvez pas utilement traiter XML avec des outils aussi simples que cela, ou avec l'analyse syntaxique ligne par ligne, car XML n'est pas basé sur une ligne. Si vous voulez réellement faire quelque chose avec l'infoset XML dans le fichier pendant que vous le lisez, vous devriez considérer un analyseur SAX. (Là encore, 1GB de XML? C'est déjà non-sensible vraiment.)

+1

+1. 'a = line.split (" <")' pour traiter XML est troublant à plusieurs niveaux. –

+0

C'est un bon point. – Ryan

3

D'autres personnes ont parlé de l'heure, je parlerai du traitement (XML mis à part).

Si vous faites quelque chose de ce genre, vous devriez certainement regarder les générateurs. This pdf vous apprendra essentiellement tout ce que vous aurez besoin de savoir sur les générateurs. Chaque fois que vous consommez ou produisez de grandes quantités de données (surtout en série), les générateurs devraient être votre meilleur ami.

+2

Cette référence a été très utile. – Ryan

+0

Quelqu'un m'a fait remarquer il ya environ un an, et depuis, j'ai trouvé toutes sortes de cas où un générateur est * beaucoup * plus approprié. Et c'est la meilleure référence pour les générateurs que j'ai jamais vu, alors j'ai pris l'habitude de la recommander partout où je peux. Personnellement, je pense que les générateurs sont l'une des caractéristiques les plus puissantes et les moins bien comprises de Python. –

8

Votre réponse:

start = time.time() 
fp = open('publisher_feed_8663.xml') 
for line in fp: 
    a = line.split('<') 
print time.time() - start 

Vous aurez besoin d'un fichier de 1 Go nommé publisher_feed_8663.xml, python et un 2Ghz Intel Core 2 Duo Machine.

Pour analyser XML, vous souhaitez probablement utiliser un analyseur de flux basé sur les événements, tel que SAX ou lxml. Je recommande de lire la documentation de lxml sur iterparse:

Comme pour combien de temps cela devrait prendre, vous pouvez faire des benchmarks de disque dur trivial sur Linux en utilisant des outils comme hdparm -tT /dev/sda. Davantage de RAM aide toujours à traiter les fichiers volumineux, car le système d'exploitation peut conserver un cache disque plus important.

+0

Je voulais demander combien de temps faut-il pour traiter le fichier compte tenu de ces contraintes. Je suis curieux de savoir si mes disques durs sont nettement sous performants. – Ryan