Tengo el siguiente código escrito para que funcione mi segundo núcleo de CPU. Lo que hace básicamente el código es encontrar primero los archivos "mar" deseados en la jerarquía del directorio y luego ejecutar el conjunto de scripts externos para procesar estos archivos binarios "mar" para producir de 50 a 100 archivos de texto y binarios en número. Como el título de la pregunta sugiere de forma paralela para aumentar la velocidad de procesamiento.Uso del grupo de multiprocesamiento de trabajadores
Esta pregunta tiene su origen en la larga discusión que hemos estado teniendo en la lista de usuarios de IPython titulada como "Cannot start ipcluster". Comenzando con mi experimentación en las funcionalidades de procesamiento paralelo de IPython.
El problema es que no puedo obtener este código funcionando correctamente. Si las carpetas que contienen archivos "mar" solo albergan archivos "mar", el guión finaliza su ejecución sin ejecutar completamente las secuencias de comandos externas. (Digamos que tengo entre 30 y 50 scripts externos para ejecutar, pero mi script habilitado para multiprocesamiento se agota solo después de ejecutar el primer script en esta cadena de scripts externa.) Curiosamente, si ejecuto este script en una carpeta ya procesada (que es archivos "mar") procesados de antemano y los archivos de salida ya están en esa carpeta) luego se ejecuta, pero esta vez obtengo aceleraciones de 2.4 a 2.7X con respecto a los tiempos de procesamiento lineal. No es muy esperado ya que solo tengo una CPU Core 2 Duo 2.5 Ghz en mi computadora portátil. Aunque tengo una GPU con CUDA, no tiene nada que ver con mi actual lucha paralela en la informática :)
¿Cuál crees que podría ser la causa de este problema?
Gracias por todos los comentarios y sugerencias.
#!/usr/bin/env python
from multiprocessing import Pool
from subprocess import call
import os
def find_sea_files():
file_list, path_list = [], []
init = os.getcwd()
for root, dirs, files in os.walk('.'):
dirs.sort()
for file in files:
if file.endswith('.sea'):
file_list.append(file)
os.chdir(root)
path_list.append(os.getcwd())
os.chdir(init)
return file_list, path_list
def process_all(pf):
os.chdir(pf[0])
call(['postprocessing_saudi', pf[1]])
if __name__ == '__main__':
pool = Pool(processes=2) # start 2 worker processes
files, paths = find_sea_files()
pathfile = [[paths[i],files[i]] for i in range(len(files))]
pool.map(process_all, pathfile)
En lugar de llamar a la secuencia de comandos externa superior, cuando intento llamar al subguión que forma parte de postprocessing_saudi, es decir, process_raw y ejecución, aparece un error misterioso: Lo siguiente es solo una parte del error. Como se muestra, la ejecución de IDL es confusa y no se puede obtener un resultado correcto. [gsever @ ccn partest] $ python proall3.py PID: 17722 PID: 17723 IDL Versión 7.1 (linux x86 m32). (c) 2009, ITT Visual Information Solutions IDL Versión 7.1 (Linux x86 m32). (c) 2009, ITT Visual Information Solutions % No se puede obtener el estado del archivo. Unidad: 0, archivo: Descriptor de archivo incorrecto –