es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo gestiona Popen la memoria?

He heredado código que eventualmente muere porque ya no puede asignar memoria.

Estoy tratando de identificar qué está acumulando el uso de memoria, y mi primera idea es que el código llama a popen cientos de miles de veces durante las pruebas. No llama a communicate, kill o terminate en esos subprocesos, pero en teoría, debería llegar al final del archivo y debería terminarlos, ¿verdad?

Intenté crear una prueba de la siguiente manera:

ARCHIVO 1: Este archivo se ejecutará y “acumulará” subprocesos a través de Popen:

import subprocess
import time

while True:
    pinger = subprocess.Popen (& # 39; ipconfig & # 39;)
    time.sleep (0.1)
    pinger.terminate () # Pruebo con esta línea y sin esta línea para ver si cambia el comportamiento. No cambia de manera notable.

ARCHIVO 2: Este archivo comienza a ejecutarse antes del archivo 1, de modo que me permite capturar el proceso de Python del archivo 1 y ver el uso de memoria con el tiempo (actualizando cada 3 segundos).

import psutil
import time
import subprocess

lista_de_procs = []
contador = 0
new_procs = []
while True:
    time.sleep (3)
    for proc en psutil.process_iter ():
        tratar:
            processName = proc.name ()
            processID = proc.pid
            if counter> 0:
                si (processID no está en lista_de_procs) y (processName.lower () == ‘python.exe’):
                    print (f & # 39; nuevo proceso encontrado: ID {processID}’)
                    print (f & # 39; El proceso se llama {processName}& # 39;)
                    new_procs.append (processID)
            if processID no está en lista_de_procs:
                lista_de_procs.append (processID)
            # imprimir (processName, :::, processID)
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pasar
    si len (new_procs)> 0:
        para elemento en new_procs:
            print (psutil.Process (item) .as_dict (attrs = [‘pid’, ‘name’, ‘memory_full_info’]))
    contador = contador + 1

En este momento, veo que la memoria se acumula muy lentamente. Me concentro principalmente en el atributo “uss” de memory_full_info.

Ese atributo aumenta, pero no aumenta con cada popen, solo puede aumentar cada 15 segundos aproximadamente, a pesar de que el proceso de Python que estoy rastreando inicie nuevas instancias de Popen cada .1 segundo.

Si alguien podría ayudarme a hacer sentido de esto, desarrollar una prueba diferente y más significativa, o simplemente entender mejor Popen y el módulo de subprocesos, por favor avise.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás tratando de identificar qué está causando el aumento del uso de memoria en tu código heredado. Has creado una prueba para intentar identificar el problema, pero no estás viendo los resultados esperados.

    Si entiendo correctamente, estás ejecutando dos archivos, uno que llama a “Popen” cientos de miles de veces y otro que captura el uso de memoria del proceso “Popen”. Esperas que el uso de memoria aumente con cada llamada a “Popen”, pero solo lo ves aumentar cada 15 segundos aproximadamente.

    Es posible que el uso de memoria no esté aumentando con cada llamada a “Popen” porque los subprocesos están siendo terminados antes de que puedan acumular memoria. Mencionaste que has probado con y sin la línea “terminate()”, y que no parece hacer una diferencia notable.

    También es posible que el uso de memoria esté aumentando, pero que el aumento sea demasiado pequeño para ser notado. Podrías intentar aumentar el tiempo de espera entre las llamadas a “Popen” para ver si el uso de memoria aumenta de manera más notable.

    Si sigues teniendo problemas para identificar el problema, es posible que desees considerar pedir ayuda a un programador más experimentado.

Comments are closed.