python - py3 - stringio install pip
¿Alternativas a las limitaciones de memoria de Python Popline.com? (2)
Creo que encontré una solución:
myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE)
for ln in myProcess.stdout:
sys.stdout.write(ln)
for ln in myProcess.stderr:
sys.stderr.write(ln)
Esto parece reducir mi uso de memoria lo suficiente como para pasar la tarea.
Actualizar
Recientemente he encontrado una forma más flexible de administrar flujos de datos en Python, utilizando threads . ¡Es interesante que Python sea tan pobre en algo que los scripts de shell pueden hacerlo fácilmente!
Tengo el siguiente fragmento de código Python (que ejecuta v2.7) que hace que se MemoryError
excepciones de MemoryError
cuando trabajo con archivos grandes (varios GB):
myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE)
myStdout, myStderr = myProcess.communicate()
sys.stdout.write(myStdout)
if myStderr:
sys.stderr.write(myStderr)
Al leer la documentación en Popen.communicate()
, parece que se está produciendo un búfer:
Nota La lectura de los datos se almacena en la memoria intermedia, por lo que no utilice este método si el tamaño de los datos es grande o ilimitado.
¿Hay una manera de deshabilitar este almacenamiento en búfer, o forzar la caché para que se borre periódicamente mientras se ejecuta el proceso?
¿Qué enfoque alternativo debería usar en Python para ejecutar un comando que transmita gigabytes de datos a stdout
?
Debo tener en cuenta que necesito manejar flujos de salida y error.
Lo que probablemente haría en su lugar, si necesitara leer la salida estándar para algo tan grande, es enviarlo a un archivo en el momento de la creación del proceso.
with open(my_large_output_path, ''w'') as fo:
with open(my_large_error_path, ''w'') as fe:
myProcess = Popen(myCmd, shell=True, stdout=fo, stderr=fe)
Edición: Si necesita transmitir, puede intentar crear un objeto similar a un archivo y pasarlo a stdout y stderr. (No he intentado esto, sin embargo.) Luego podría leer (consultar) del objeto mientras se escribe.