Ada dua pendekatan untuk membatasi penggunaan memori Anda: Ex post facto, dan preemptive. Artinya, Anda dapat mencoba untuk mematikan program Anda setelah terlalu besar, atau Anda dapat memprogramnya untuk tidak menjadi terlalu besar.
Jika Anda bersikeras pada pendekatan ex post facto, Anda dapat menggunakan skrip Bash berikut. Script ini pertama-tama menemukan jumlah memori (seperti yang didefinisikan oleh "resident set size") yang digunakan oleh prosesid pid, memfilter semua data non numerik menggunakan grep, dan menyimpan jumlahnya sebagai variabel n. Script kemudian memeriksa apakah n lebih besar dari x yang Anda tentukan. Jika ya, proses dengan pid prosesi terbunuh.
Tolong dicatat:
- Anda harus mengganti
<pid>
dengan id proses program Anda.
- Anda harus mengganti
<x>
dengan rss = "resident set size" (yaitu ukuran memori sebenarnya) yang tidak Anda inginkan melebihi program.
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
Jika Anda ingin ini berjalan setiap y detik, cukup masukkan dalam satu lingkaran, dan katakan itu untuk menunggu y detik setelah setiap iterasi. Anda juga bisa menulis perintah serupa menggunakan top
. Titik awal Anda adalah top -l 1|grep "<pid>"|awk '{print $10}'
.
@ kenorb ini jawabannya membantu saya dengan naskah saya
Sementara saya percaya bahwa menjawab pertanyaan, dalam jangka panjang saya percaya itu adalah desain pemrograman yang lebih baik untuk mengambil pendekatan preemptive menggunakan alokasi memori manual.
Pertama, apakah Anda yakin penggunaan memori benar-benar masalah? Dokumentasi Go menyatakan:
Pengalokasi memori Go mencadangkan wilayah besar memori virtual sebagai arena alokasi. Memori virtual ini bersifat lokal untuk proses Go tertentu; reservasi tidak menghilangkan proses memori lainnya.
Jika Anda masih berpikir Anda memiliki masalah, maka saya mendorong Anda untuk mengelola memori secara manual seperti yang dilakukan dalam bahasa pemrograman C. Karena go ditulis dalam C, saya curiga akan ada cara untuk masuk ke manajemen / alokasi memori C, dan memang ada. Lihat repositori github ini yang,
memungkinkan Anda melakukan manajemen memori manual melalui pengalokasi C standar untuk sistem Anda. Ini adalah pembungkus tipis di atas malloc, calloc dan bebas dari. Lihat man malloc untuk detail tentang fungsi-fungsi ini untuk sistem Anda. Perpustakaan ini menggunakan cgo.
Kasus penggunaan diberikan sebagai:
Mengapa Anda menginginkan ini?
Ketika suatu program menyebabkan tekanan memori atau sistem kehabisan memori, akan sangat membantu untuk secara manual mengontrol alokasi dan deallokasi memori. Go dapat membantu Anda mengontrol alokasi tetapi tidak mungkin untuk secara eksplisit membatalkan alokasi data yang tidak diperlukan.
Ini sepertinya solusi jangka panjang yang lebih baik.
Jika Anda ingin mempelajari lebih lanjut tentang C (termasuk manajemen memori),
Bahasa Pemrograman C adalah referensi standar.