你好,堆栈溢出社区,

我目前正在开发一个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选项,如缓存大小和文件限制,但似乎在配置或删除过程中可能遗漏了一些东西.

问题:

  1. 什么原因会导致删除记录后LevelDB数据库文件夹大小不按比例减少?
  2. 为了更有效地管理数据库大小,我是否应该考虑其他配置或优化?
  3. 在levigo中有没有压缩数据库以释放未使用空间的具体方法?

对解决这一问题的任何见解或指导都将不胜感激.谢谢!

推荐答案

By reading this issue on level DB repo I realized that I can add this line at the end of the deletion loop db.CompactRange(levigo.Range{})
so the DB will delete the unused data and the total DB folder size is decreasing according to it.

Database相关问答推荐

文件存储的推荐位置 - 在数据库或其他什么地方?

动态数据模型

PostgreSQL 参数化 Order By / Limit in table 函数

MySQL解释更新

使用 Java 对 mysql 数据库进行简单备份和恢复

使用 ContentValues 和更新方法更新 sql 数据库

在事务提交之前传递 JMS 消息

如何避免使用 LINQ-To-SQL 的内存泄漏?

无法在 MYSQL 5.5 w/MYSQL Workbench 中更改模式名称

将实体框架中的字符串列映射到枚举

Django中的Atomic原子操作?

PHP 和 MySQL Select 单个值

在服务器上排序还是在客户端排序?

如何配置 NLog 以写入数据库?

Rails:'schema.rb' 中的版本号是否用于任何用途?

Django:检测数据库后端

将 NULL 插入 MySQL 时间戳

我可以在 /sdcard 上下载 SQLite 数据库并从我的 Android 应用程序访问它吗?

DBMS中数据模型和数据库模式的区别?

在两列之间 Select 最近的日期