Hay dos enfoques para limitar el uso de la memoria: ex post facto y preventivo. Es decir, puede intentar matar su programa después de que se haya vuelto demasiado grande, o puede programarlo para que no sea demasiado grande en primer lugar.
Si insiste en el enfoque ex post facto, puede usar el siguiente script de Bash. Este script primero encuentra la cantidad de memoria (como se define por "tamaño de conjunto residente") que el proceso con processid pid está usando, filtra todos los datos no numéricos usando grep y guarda la cantidad como variable n. El script luego comprueba si n es mayor que su x especificado. Si es así, el proceso con procesid pid se elimina.
Tenga en cuenta:
- Debe reemplazar
<pid>
con la identificación del proceso de su programa.
- Debe reemplazar
<x>
con rss = "tamaño de conjunto residente" (es decir, tamaño de memoria real) que no desea que exceda el programa.
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
Si desea que esto se ejecute cada y segundos, inclúyalo en un bucle y dígale que espere y segundos después de cada iteración. También podría escribir un comando similar usando top
. Tu punto de partida sería top -l 1|grep "<pid>"|awk '{print $10}'
.
La respuesta de @Kenorb me ayudó con mi guión
Si bien creo que eso responde a la pregunta, a la larga creo que es un mejor diseño de programación adoptar un enfoque preventivo utilizando la asignación manual de memoria.
En primer lugar, ¿estás seguro de que el uso de memoria es realmente un problema? La documentación de Go dice:
El asignador de memoria Go reserva una gran región de memoria virtual como escenario de asignaciones. Esta memoria virtual es local para el proceso específico de Go; La reserva no priva a otros procesos de memoria.
Si aún cree que tiene un problema, le recomiendo que administre manualmente su memoria como se hace en el lenguaje de programación C. Como go está escrito en C, sospeché que habría formas de ingresar a la administración / asignaciones de memoria C, y de hecho las hay. Vea este repositorio de github que,
le permite administrar manualmente la memoria a través del asignador estándar de C para su sistema. Es una envoltura delgada sobre malloc, calloc y sin. Consulte man malloc para obtener detalles sobre estas funciones para su sistema. Esta biblioteca usa cgo.
El caso de uso se da como:
Por qué querrías esto?
Cuando un programa está causando presión en la memoria o el sistema se está quedando sin memoria, puede ser útil controlar manualmente las asignaciones y desasignaciones de memoria. Go puede ayudarlo a controlar las asignaciones, pero no es posible desasignar explícitamente datos innecesarios.
Esto parece una mejor solución a largo plazo.
Si desea obtener más información sobre C (incluida la administración de memoria),
el lenguaje de programación C es la referencia estándar.