Istnieją dwa podejścia do ograniczenia użycia pamięci: ex post facto i zapobiegawcze. To znaczy, możesz spróbować zabić swój program po tym, jak stał się zbyt duży, lub możesz tak zaprogramować, aby nie był zbyt duży.
Jeśli nalegasz na faktyczne podejście ex post, możesz użyć następującego skryptu Bash. Ten skrypt najpierw wyszukuje ilość pamięci (zgodnie z definicją „rezydentnego rozmiaru zestawu”), której używa proces z pid procesid, odfiltrowuje wszystkie dane nienumeryczne za pomocą grep i zapisuje tę ilość jako zmienną n. Skrypt sprawdza następnie, czy n jest większe od podanego x. Jeśli tak, proces z procid pid zostaje zabity.
Proszę zanotować:
- Musisz zastąpić
<pid>
identyfikatorem procesu swojego programu.
- Musisz zamienić
<x>
na rss = "resident set size" (tzn. Rzeczywisty rozmiar pamięci), którego program nie powinien przekraczać.
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
Jeśli chcesz, aby działało to co sekundę, po prostu umieść go w pętli i każ mu czekać y sekund po każdej iteracji. Możesz również napisać podobne polecenie za pomocą top
. Twoim punktem wyjścia byłoby top -l 1|grep "<pid>"|awk '{print $10}'
.
@ kenorb za odpowiedź pomógł mi z moim skrypcie
Chociaż uważam, że to odpowiada na pytanie, na dłuższą metę uważam, że lepszym rozwiązaniem programistycznym jest podejście zapobiegawcze z wykorzystaniem ręcznego przydzielania pamięci.
Po pierwsze, czy jesteś pewien, że użycie pamięci jest naprawdę problemem? GO dokumentacja stanowi:
Alokator pamięci Go rezerwuje duży region pamięci wirtualnej jako arenę alokacji. Ta pamięć wirtualna jest lokalna dla określonego procesu Go; rezerwacja nie pozbawia innych procesów pamięci.
Jeśli nadal uważasz, że masz problem, zachęcam do ręcznego zarządzania pamięcią, tak jak dzieje się to w języku programowania C. Ponieważ go jest napisane w C, podejrzewałem, że będą sposoby na zarządzanie pamięcią C / alokacje, i rzeczywiście są. Zobacz to repozytorium github, które:
pozwala na ręczne zarządzanie pamięcią za pomocą standardowego alokatora C dla twojego systemu. Jest to cienkie opakowanie na malloc, calloc i wolne od. Zobacz man malloc, aby uzyskać szczegółowe informacje na temat tych funkcji w systemie. Ta biblioteka używa cgo.
Przypadek użycia podano jako:
Dlaczego miałbyś tego chcieć?
Gdy program powoduje presję pamięci lub w systemie kończy się pamięć, pomocne może być ręczne kontrolowanie przydziału i zwolnienia pamięci. Go może pomóc kontrolować przydziały, ale nie można jawnie cofnąć przydziału niepotrzebnych danych.
To wydaje się lepszym rozwiązaniem długoterminowym.
Jeśli chcesz dowiedzieć się więcej o C (w tym o zarządzaniu pamięcią),
język programowania C jest standardowym źródłem informacji.