versiones guia español descargar actualizar python networking memory subprocess paramiko

python - guia - qgis manual



Cómo evitar[Errno 12] No se pueden asignar errores de memoria causados por el uso del módulo de subproceso (3)

Esto debería hacerlo:

http://docs.python.org/3.3/library/subprocess.html#replacing-os-popen-os-popen2-os-popen3

De esta forma, puedes leer líneas o bloques, en lugar de todo al mismo tiempo.

Caso de prueba de trabajo completo

Por supuesto, dependiendo de su memoria en las máquinas locales y remotas, sus tamaños de matriz serán diferentes.

z1 = numpy.random.rand(300000000,2); for i in range(1000): print(''*******************************************/n''); direct_output = subprocess.check_output(''ssh blah@blah "ls /"'', shell=True); direct_output = ''a''*1200000; a2 = direct_output*10; print(len(direct_output));

Caso de uso actual

En caso de que ayude mi caso de uso es el siguiente:

Publiqué consultas de DB y luego almacené las tablas resultantes en la máquina remota. Luego quiero transferirlos a través de una red y hacer análisis. Hasta ahora he estado haciendo algo como lo siguiente en Python:

#run a bunch of queries before hand with the results in remote files .... counter = 0 mergedDataFrame = None while NotDone: output = subprocess.check_output(''ssh blah@blah cat /data/file%08d''%(counter)) data = pandas.read_csv(...) #do lots of analysis, append, merge, numpy stuff etc... mergedDataFrame = pandas.merge(...) counter += 1

En algún momento recibo el siguiente error en el comando check_output: [Errno 12] No se puede asignar memoria

Fondo

Gracias a las siguientes preguntas, creo tener una idea de lo que está mal. Hay una serie de soluciones publicadas, y estoy tratando de determinar cuál de las soluciones evitará [Errno 12] No se puede asignar el error de memoria asociado con la implementación del subproceso usando fork / clone.

Python subprocess.Popen "OSError: [Errno 12] No se puede asignar memoria" Esto le da el diagnóstico subyacente y sugiere algunas soluciones como generar secuencia de comandos separada, etc ...

Comprender los errores de asignación de memoria y fork de Python. Sugiere utilizar rfoo para eludir la limitación del subproceso de fork / clone y el proceso hijo de spawning y copiar memoria, etc ... Esto parece implicar un modelo de cliente-servidor

¿Cuál es la forma más simple de usar SSH Python? , pero tengo las limitaciones adicionales que no puedo usar el subproceso debido a las limitaciones de memoria y la implementación fork / clone? Las soluciones sugieren el uso de paramiko o algo construido sobre él, otros sugieren un subproceso (que he encontrado que no funcionará en mi caso).

Hubo otras preguntas similares, pero las respuestas a menudo hablaban de que los descriptores de archivos eran los culpables (en este caso no), añadiendo más RAM al sistema (no puedo hacer esto), actualizando a x64 (ya estoy en x64). Algunos insinúan el problema de ENOMEM. Algunas respuestas mencionan tratar de determinar si el subproceso.Popen (en mi caso check_output) no está limpiando adecuadamente los procesos, pero parece que S. Lott y otros acuerdan que el código del subproceso se está limpiando adecuadamente.

He buscado a través del código fuente en github https://github.com/paramiko/paramiko/search?q=Popen&type=Code y parece usar un subproceso en el archivo proxy.py.

Preguntas reales

¿Significa esto que, en última instancia, paramiko está utilizando la solución de Popen descrita anteriormente que tendrá problemas cuando crezca la huella de memoria de python y se realicen llamadas de Popen repetidas debido a la implementación de clon / tenedor?

Si el paramiko no funciona, ¿hay alguna otra manera de hacer lo que estoy buscando con una solución solo para el lado del cliente? ¿O se necesitará una solución cliente / servidor / socket? Si es así, ¿alguna de rfoo, tornado o zeromq, las transferencias http funcionan aquí?

Notas Estoy ejecutando memoria principal de 64 bits de Linux de 8 bits. No quiero buscar las opciones de comprar más RAM.


Si se está quedando sin memoria, es posible que desee aumentar su memoria de intercambio. O puede que no tenga ningún intercambio habilitado en absoluto. En Ubuntu (también debería funcionar para otras distribuciones), puedes verificar tu intercambio de la siguiente manera:

$sudo swapon -s

si está vacío, significa que no tiene habilitado ningún intercambio. Para agregar un intercambio de 1GB:

$sudo dd if=/dev/zero of=/swapfile bs=1024 count=1024k $sudo mkswap /swapfile $sudo swapon /swapfile

Agregue la siguiente línea al fstab para que el intercambio sea permanente.

$sudo vim /etc/fstab /swapfile none swap sw 0 0

Fuente y más información se pueden encontrar here .


Si se está quedando sin memoria, es probable porque el subproceso está tratando de leer demasiado en la memoria al mismo tiempo. La solución, además de usar un redireccionamiento a un archivo local, es probablemente usar una funcionalidad tipo popen con un par stdin / stdout que se pueda leer de a poco.