Datos de multiprocesamiento y serialización de Python

Estoy ejecutando un script en una computadora de la escuela usando el módulo de multiprocessing . Estoy serializando los datos con frecuencia. Se puede resumir mediante el siguiente código:

 import multiprocessing as mp import time, pickle def simulation(j): data = [] for k in range(10): data.append(k) time.sleep(1) file = open('data%d.pkl'%j, 'wb') pickle.dump(data, file) file.close() if __name__ == '__main__': processes = [] processes.append(mp.Process(target = simulation, args = (1,) )) processes.append(mp.Process(target = simulation, args = (2,) )) for process in processes: process.start() for process in processes: process.join() 

Entonces, cuando ejecuto mi código para muchas más simulaciones y lo que imagino que son tareas más intensas y variadas, IOError: [Errno 5] Input/output error el siguiente error: IOError: [Errno 5] Input/output error generalmente precedido por file.open(...) o file.close() .

Mis preguntas:

  • ¿Cómo soluciono este error en mi script?
  • ¿Qué significa este error para un recién llegado de python? Referencias apreciadas.

Algunas notas más sobre mi procedimiento:

  • En lugar de configurar el daemon atributos de multiproceso como True , uso la pantalla para ejecutar el script y luego lo separo. Esto también me permite desconectarme sin preocuparme por la detención de mi script.
  • Esta parecía ser una pregunta relacionada con la impresión utilizando el módulo de subprocess . No utilicé explícitamente el demonio como dije, así que no estoy seguro de si esto ayudará.
  • Esto suele ocurrir después de ejecutarse durante aproximadamente un día y ocurre en diferentes procesos en diferentes momentos.

Tu progtwig se ve bastante bien. En este caso, IOError solo significa “sucedieron cosas malas”. El conjunto completo de datos simulados se hizo demasiado grande para el proceso de Python, por lo que salió con el mensaje misterioso.

Un par de mejoras en la siguiente versión:

  • Una vez que se hayan producido algunos datos, agréguelos a un archivo de datos y luego sáquelos de la memoria. El progtwig debería tener aproximadamente el mismo uso de RAM a lo largo del tiempo, en lugar de usar cada vez más, y luego fallar.

  • Convenientemente, si un archivo es una concatenación de objetos de pickle , podemos imprimir fácilmente cada uno para su posterior examen. Código de ejemplo mostrado.

¡Que te diviertas!

fuente

 import multiprocessing as mp import glob, time, pickle, sys def simulation(j): for k in range(10): datum = {'result': k} time.sleep(1) with open('data%d.pkl'%j, 'ab') as dataf: pickle.dump(datum, dataf) def show(): for datname in glob.glob('data*.pkl'): try: print '*'*8, datname with open(datname, 'rb') as datf: while True: print pickle.load(datf) except EOFError: pass def do_sim(): processes = [] processes.append(mp.Process(target = simulation, args = (1,) )) processes.append(mp.Process(target = simulation, args = (2,) )) for process in processes: process.start() for process in processes: process.join() if __name__ == '__main__': if '--show' in sys.argv: show() else: do_sim() 

salida de “python ./msim.py –show”

 ******** data2.pkl {'result': 0} {'result': 1} {'result': 2} {'result': 3} {'result': 4} {'result': 5} {'result': 6} {'result': 7} {'result': 8} {'result': 9} ******** data1.pkl {'result': 0} {'result': 1} {'result': 2} {'result': 3} {'result': 4} {'result': 5} {'result': 6} {'result': 7} {'result': 8} {'result': 9}