2017-10-03 9 views
1

J'essaye de paralléliser une partie de mon code existant. Je voudrais sauvegarder la sortie de chaque itération dès qu'elle se termine afin que je n'ai pas à stocker toute la boucle en mémoire. Fondamentalement quelque chose comme ceci:Python: sortie Pickle pour chaque itération en utilisant le multi-traitement

import cPickle as pickle 
from multiprocessing import Pool 

if __name__ == '__main__': 
    outf = open('test_mp.pkl', 'wb') 

    def f(x): 
     pickle.dump([x, x*x], outf, -1) 
     return x*x 

    pool = Pool(4) 
    out = pool.map(f, range(100)) 
    print out 

Le code s'exécute sans erreurs ou avertissements et produit la valeur correcte pour 'out'. Cependant, lorsque je tente de lire dans le fichier cornichon qui a été produit, rien ne semble avoir été écrit du tout:

>>> f = open('test_mp.pkl', 'rb') 
>>> pickle.load(f) 
--------------------------------------------------------------------------- 
EOFError         Traceback (most recent call last) 
<ipython-input-4-4d7131bbd231> in <module>() 
----> 1 pickle.load(f) 

EOFError: 

Je suis actuellement à une perte pour laquelle je ne peux pas jeter un cornichon objet au milieu d'une boucle. J'ai essayé ce code sans multiprocessing (c'est-à-dire juste une boucle pour) et cela fonctionne très bien.

J'ai également déplacé la fonction en dehors de main() et passée dans 'outf' comme argument supplémentaire. Cette méthode donne une erreur sur la tentative d'écriture dans un fichier fermé. Comment puis-je sauvegarder ma sortie dans un fichier pickle lorsque ma boucle est parallélisée?

+0

différents processus * ne partagent pas l'état *. –

Répondre

0

Vous aurez un problème avec les threads essayant d'accéder au même handle de fichier en même temps. Au lieu de cela, vous pouvez pickle dans une liste en utilisant la méthode .dumps, puis vider le bytearray combiné dans un fichier à la fin. Dans le cas contraire, vous pouvez choisir parmi chaque processus dans un descripteur de fichier séparé, de sorte que vous disposerez d'un fichier pour chaque processus. En outre, le décapage n'est pas le moyen idéal pour stocker d'énormes quantités de données. Il existe des formats de fichiers spécialement conçus tels que HDF5 (http://www.h5py.org/) qui sont vraiment bien adaptés pour le stockage de données numériques énorme. L'implémentation h5py est très mature et facile à utiliser, et peut également vous permettre de stocker vos données en parallèle.