editor php Strawberry akan memperkenalkan kepada anda hari ini kaedah yang sangat praktikal, iaitu mengekstrak memori dan bertukar maklumat daripada /proc/meminfo di Golang. Semasa proses pembangunan Golang, kita selalunya perlu mendapatkan memori sistem dan bertukar maklumat untuk melaksanakan beberapa pengoptimuman prestasi atau operasi pengurusan sumber. /proc/meminfo ialah fail yang menyimpan memori sistem dan maklumat pertukaran Kita boleh mendapatkan maklumat yang diperlukan dengan membaca fail ini. Seterusnya, saya akan memperkenalkan secara terperinci cara menggunakan Golang untuk mengekstrak memori dan bertukar maklumat dalam /proc/meminfo saya harap ia akan membantu anda.
Saya ingin mengekstrak nilai memtotal, memfree, memavailable, swaptotal dan swapfree daripada /proc/meminfo dalam golang. Yang paling dekat yang saya perolehi setakat ini ialah menggunakan fmt.sscanf() yang akan memberikan saya nilai yang saya inginkan satu demi satu, tetapi saya juga mendapat banyak baris keluaran dengan sifar. Ini adalah kod yang saya gunakan:
package main import ( "bufio" "fmt" "os" ) func main() { f, e := os.open("/proc/meminfo") if e != nil { panic(e) } defer f.close() s := bufio.newscanner(f) for s.scan() { var n int fmt.sscanf(s.text(), "memfree: %d kb", &n) fmt.println(n) } }
Ini memberikan saya hasil berikut:
0 11260616 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Soalan pertama, adakah terdapat cara untuk mengehadkan hasil kepada satu nilai (bukan sifar) yang saya mahukan? Atau, adakah cara yang lebih baik untuk menyelesaikan masalah ini?
Fail /proc/meminfo saya kelihatan seperti ini:
MemTotal: 16314336 kB MemFree: 11268004 kB MemAvailable: 13955820 kB Buffers: 330284 kB Cached: 2536848 kB SwapCached: 0 kB Active: 1259348 kB Inactive: 3183140 kB Active(anon): 4272 kB Inactive(anon): 1578028 kB Active(file): 1255076 kB Inactive(file): 1605112 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 4194304 kB SwapFree: 4194304 kB Dirty: 96 kB Writeback: 0 kB AnonPages: 1411704 kB Mapped: 594408 kB Shmem: 6940 kB KReclaimable: 151936 kB Slab: 253384 kB SReclaimable: 151936 kB SUnreclaim: 101448 kB KernelStack: 17184 kB PageTables: 25060 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 12351472 kB Committed_AS: 6092984 kB VmallocTotal: 34359738367 kB VmallocUsed: 40828 kB VmallocChunk: 0 kB Percpu: 5696 kB AnonHugePages: 720896 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB FileHugePages: 0 kB FilePmdMapped: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB DirectMap4k: 230400 kB DirectMap2M: 11235328 kB DirectMap1G: 14680064 kB
Perhatikan bahawa s.Scan()
逐行读取输入。如果某行与给 fmt.Sscanf
的格式字符串不匹配,则程序将输出 0 作为 var n int
diisytiharkan dalam gelung. Cadangan saya ialah untuk menyemak hasil pertama yang dikembalikan oleh fmt.Sscanf`, iaitu bilangan item yang sepadan. Jadi jika keputusan pertama ialah 1, itu bermakna terdapat padanan dan nilai itu boleh dikeluarkan. Lihat contoh yang berfungsi di sini: //m.sbmmt.com/link/25d0a45ccd9e33b6b1ef8760801b6841 p>
EDIT: Saya cuba sedekat mungkin dengan kod anda. Mungkin ada isu lain kerana unit ukuran yang digunakan mungkin berbeza mengikut man page. Walau bagaimanapun, jika nilai yang berkaitan pada sistem anda sentiasa dikeluarkan dalam "kB", maka ia mungkin mencukupi untuk kes penggunaan anda.
Atas ialah kandungan terperinci Ekstrak memori dan tukar maklumat daripada /proc/meminfo di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!