2010-07-26 7 views
4

J'ai un gros transfert de fichiers (dire 4gb environ) et plutôt que d'utiliser shutil, je suis juste d'ouvrir et d'écrire le chemin de fichier normal que je peux inclure un pourcentage de progression lors de son déplacement le long de.Reprise d'un fichier volumineux écriture en Python

Il vint alors à moi d'essayer de tenter de reprendre l'écriture de fichiers, si pour une raison quelconque, il foireuse au cours du processus. Cependant, je n'ai pas eu de chance. Je supposais que ce serait une combinaison intelligente de compenser la lecture du fichier source et d'utiliser la recherche, mais je n'ai pas eu de chance jusqu'à présent. Des idées?

De plus, est-il une sorte de façon dynamique pour comprendre ce que la taille de bloc à utiliser lors de la lecture et l'écriture de fichiers? Je suis assez novice dans ce domaine, et je viens de lire pour utiliser une taille plus grande pour un fichier plus grand (j'utilise 65536 pour le moment). Y a-t-il une façon intelligente de le faire, ou devine-t-on simplement ...? Merci les gars.

Voici l'extrait de code du transfert de fichier appending:

   newsrc = open(src, 'rb') 
       dest_size = os.stat(destFile).st_size 
       print 'Dest file exists, resuming at block %s' % dest_size 
       newsrc.seek(dest_size) 
       newdest = open(destFile, 'a') 
       cur_block_pos = dest_size 
       # Start copying file 
       while True: 
        cur_block = newsrc.read(131072)      
        cur_block_pos += 131072 
        if not cur_block: 
         break 
        else: 
         newdest.write(cur_block) 

Il n'ajoute et commencer à écrire, mais il écrit alors dest_size plus de données à la fin que prévu pour des raisons probablement évidentes au reste de toi. Des idées?

+0

Qu'est-ce qui se passe mal avec le transfert de fichiers? –

+1

Pouvez-vous nous montrer votre tentative d'ajout au fichier? Vous devriez être capable de chercher et de continuer à écrire. Ouvrez-vous en utilisant le mode "a"? –

+0

Rien ne s'est vraiment mal passé avec le transfert de fichiers. Mais au fur et à mesure que je développe ce code qui déplace des fichiers de plus de 6 Go sur un réseau, il est bon de pouvoir le lancer pour observer de nouveaux changements et le reprendre là où il s'était arrêté sur les gros transferts de fichiers. J'ai ajouté le code à l'op. – Cryptite

Répondre

1

Pour la deuxième partie de votre question, les données sont généralement lues et écrites sur un disque dur en blocs de 512 octets. Donc, en utilisant une taille de bloc qui est un multiple de cela devrait donner le transfert le plus efficace. A part ça, ça n'a pas beaucoup d'importance. Gardez simplement à l'esprit que quelle que soit la taille de bloc que vous spécifiez, la quantité de données stockées par l'opération d'E/S à un moment donné ne doit pas être trop importante pour que votre mémoire RAM soit trop importante. Je pense que 8K (8192) est un choix commun, mais 64K devrait être bien. (Je ne pense pas que la taille du fichier en cours des questions transférées beaucoup lorsque vous choisissez la meilleure taille de bloc)

+0

Il y a généralement une couche de mise en tampon par le système d'exploitation entre les deux, donc même si vous utilisez quelque chose qui n'est * pas * un multiple de 512, cela n'a peut-être pas d'importance. Mais il est trivial d'essayer différentes tailles de blocs, de le comparer vous-même si vous voulez être sûr! – Wim

Questions connexes