Esistono due approcci per limitare l'utilizzo della memoria: Ex post facto e Preemptive. Vale a dire, puoi provare a uccidere il tuo programma dopo che è diventato troppo grande, oppure puoi programmarlo per non diventare troppo grande in primo luogo.
Se insisti sull'approccio ex post facto, puoi utilizzare il seguente script Bash. Questo script rileva innanzitutto la quantità di memoria (definita da "dimensione set residente") utilizzata dal processo con processid pid, filtra tutti i dati non numerici utilizzando grep e salva la quantità come variabile n. Lo script controlla quindi se n è maggiore della x specificata. In tal caso, il processo con processid pid viene interrotto.
Notare che:
- È necessario sostituire
<pid>
con l'id processo del programma.
- È necessario sostituire
<x>
con rss = "resident set size" (ovvero dimensione della memoria reale) che non si desidera superare.
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
Se vuoi che funzioni ogni y secondi, includilo in un ciclo e digli di aspettare y secondi dopo ogni iterazione. Puoi anche scrivere un comando simile usando top
. Il tuo punto di partenza sarebbe top -l 1|grep "<pid>"|awk '{print $10}'
.
La risposta di @ kenorb mi ha aiutato con la mia sceneggiatura
Mentre credo che risponda alla domanda, nel lungo periodo credo che sia meglio progettare la programmazione per adottare un approccio preventivo usando l'allocazione manuale della memoria.
Innanzitutto, sei sicuro che l'utilizzo della memoria sia davvero un problema? La documentazione Go afferma:
L'allocatore di memoria Go riserva un'ampia area di memoria virtuale come arena per le allocazioni. Questa memoria virtuale è locale per il processo Go specifico; la prenotazione non priva altri processi di memoria.
Se pensi ancora di avere un problema, ti incoraggio a gestire manualmente la tua memoria come avviene nel linguaggio di programmazione C. Dato che go è scritto in C, sospettavo che ci sarebbero stati modi per accedere alla gestione / allocazioni della memoria C, e in effetti ci sono. Vedi questo repository github che,
consente di eseguire la gestione manuale della memoria tramite l'allocatore C standard per il proprio sistema. È un involucro sottile sopra malloc, calloc e privo di. Vedi man malloc per i dettagli su queste funzioni per il tuo sistema. Questa libreria utilizza cgo.
Il caso d'uso è indicato come:
perchè vorresti questo?
Quando un programma sta causando pressione della memoria o il sistema sta esaurendo la memoria, può essere utile controllare manualmente le allocazioni di memoria e le deallocazioni. Go può aiutarti a controllare le allocazioni ma non è possibile deallocare esplicitamente i dati non necessari.
Sembra una soluzione a lungo termine migliore.
Se vuoi saperne di più su C (compresa la gestione della memoria),
il linguaggio di programmazione C è il riferimento standard.