你好,堆栈溢出社区,
我目前正在开发一个Go程序,该程序使用levigo包将LevelDB用于数据存储.我的目标是有效地管理数据库大小,特别是在可用存储空间不足时删除旧记录.然而,我观察到了一个意想不到的行为:在删除记录之后,LevelDB数据库文件夹的大小并没有成比例地减小.
以下是重现该问题的代码的简化版本:
Saving Data Code:个
package main
import (
"crypto/rand"
"fmt"
"log"
"github.com/jmhodges/levigo"
)
func main() {
// Specify the LevelDB options
options := levigo.NewOptions()
cache := levigo.NewLRUCache(5 << 20)
options.SetCache(cache)
options.SetCreateIfMissing(true)
options.SetMaxOpenFiles(100)
// Open or create the LevelDB database
db, _ := levigo.Open("/tmp/mydatabase", options)
defer db.Close()
dataSize := 1024 * 1024 * 5 // 5MB
randomData := make([]byte, dataSize)
rand.Read(randomData)
// Enqueue 5 pieces of data
for i := 1; i <= 5; i++ {
key := []byte(fmt.Sprintf("key%d", i))
// Write the batch to the database
if err := db.Put(levigo.NewWriteOptions(), key, randomData); err != nil {
log.Fatal(err)
}
fmt.Printf("Enqueued: %s \n", key)
}
fmt.Println("Enqueue completed.")
}
Deleting Data Code:个
package main
import (
"fmt"
"log"
"github.com/jmhodges/levigo"
)
func main() {
// Specify the LevelDB options
options := levigo.NewOptions()
cache := levigo.NewLRUCache(5 << 20)
options.SetCache(cache)
options.SetCreateIfMissing(true)
options.SetMaxOpenFiles(100)
// Open or create the LevelDB database
db, _ := levigo.Open("/tmp/mydatabase", options)
defer db.Close()
// Dequeue (remove) the 3 pieces of data
for i := 1; i <= 3; i++ {
key := []byte(fmt.Sprintf("key%d", i))
// Create a WriteOptions for deleting from the database
wo := levigo.NewWriteOptions()
defer wo.Close()
// Delete the key from the database
if err := db.Delete(wo, key); err != nil {
log.Fatal(err)
}
fmt.Printf("Dequeued: %s\n", key)
}
fmt.Println("Dequeue completed.")
}
运行代码以保存5个项目后,数据库文件夹大小为30MB.随后,当我运行代码删除3个项目时,文件夹大小减少到26MB.考虑到删除的数据量,我预计大小会有更大的减少.
我已经设置了LevelDB选项,如缓存大小和文件限制,但似乎在配置或删除过程中可能遗漏了一些东西.
问题:
- 什么原因会导致删除记录后LevelDB数据库文件夹大小不按比例减少?
- 为了更有效地管理数据库大小,我是否应该考虑其他配置或优化?
- 在levigo中有没有压缩数据库以释放未使用空间的具体方法?
对解决这一问题的任何见解或指导都将不胜感激.谢谢!