package main
import (
"fmt"
"os"
"runtime"
"time"
"github.com/dgraph-io/badger"
)
func main() {
// Create or open Badger DB
path := "./data"
opts := badger.DefaultOptions(path).
WithMaxTableSize(1 << 20). // 1 MiB memtable (default was 64 MiB)
WithValueLogFileSize(1 << 26). // 64 MiB value log
WithNumMemtables(1). // Limit to 1 memtable
WithValueLogLoadingMode(0). // FileIO mode (not mmap)
WithSyncWrites(false) // Disable sync for testing
db, err := badger.Open(opts)
if err != nil {
panic(err)
}
defer db.Close()
// Monitor memory usage
opened := false
for i := 0; i < 5; i++ {
time.Sleep(5 * time.Second)
printMemUsage()
if !opened {
fmt.Println("Opening Badger DB...")
opened = true
}
}
}
// printMemUsage outputs detailed memory stats
func printMemUsage() {
var m runtime.MemStats
runtime.ReadMemStats(&m)
// Resident memory via /proc/self/stat (Linux only)
rss := getRSS()
fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
fmt.Printf("\tRSS = %v MiB", bToMb(uint64(rss)))
fmt.Printf("\tNumGC = %v\n", m.NumGC)
}
func bToMb(b uint64) uint64 {
return b / 1024 / 1024
}
// getRSS retrieves resident memory size (Linux-specific)
func getRSS() int64 {
if runtime.GOOS != "linux" {
return 0 // Fallback for non-Linux systems
}
data, err := os.ReadFile("/proc/self/stat")
if err != nil {
return 0
}
var ignore int
var rss int64
// RSS is the 24th field in /proc/self/stat
_, err = fmt.Sscanf(string(data), "%d %s %c %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
&ignore, new(string), new(byte), &ignore, &ignore, &ignore, &ignore, &ignore, &ignore, &ignore,
&ignore, &ignore, &ignore, &ignore, &ignore, &ignore, &ignore, &ignore, &ignore, &ignore,
&ignore, &ignore, &ignore, &rss)
if err != nil {
return 0
}
return rss * os.Getpagesize() // Convert pages to bytes
}