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?
différents processus * ne partagent pas l'état *. –