搜尋
首頁後端開發GolangGo 中 LevelDB 資料庫大小縮減的問題 (levigo)
Go 中 LevelDB 資料庫大小縮減的問題 (levigo)Feb 11, 2024 am 11:06 AM
鍵值對overflow

Go 中 LevelDB 数据库大小缩减的问题 (levigo)

php小編柚子在這篇文章中將為大家介紹 Go 中使用 LevelDB 資料庫時可能遇到的大小縮減問題以及解決方案。 LevelDB 是一款高效能的鍵值對資料庫,但在處理大量資料時,資料庫的大小可能會迅速成長,佔用大量儲存空間。文章將詳細討論如何透過使用 levigo 函式庫來解決這個問題,以及使用壓縮演算法來減少資料庫的大小,從而提高效能和節約儲存空間。無論您是初學者還是有經驗的開發者,這篇文章都將對您有所幫助。

問題內容

Stack Overflow 社群您好,

我目前正在開發一個 Go 程序,該程序使用 levigo 套件利用 LevelDB 進行資料儲存。我的目標是有效管理資料庫大小,特別是在可用儲存空間不足時刪除舊記錄。但是,我觀察到一個意外的行為:刪除記錄後,LevelDB 資料庫資料夾大小並沒有按比例減少。

這是重現問題的程式碼的簡化版本:

儲存資料代碼:

#
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.")
}

刪除資料代碼:

#
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中有沒有特定的方法來壓縮資料庫以釋放未使用的空間?

任何有關解決此問題的見解或指導將不勝感激。謝謝!

解決方法

透過閱讀此level DB 儲存庫上的問題,我意識到我可以添加此內容刪除循環末尾的行db.CompactRange (levigo.Range{})
# 因此資料庫將刪除未使用的數據,並且資料庫資料夾的總大小也會隨之減小。

以上是Go 中 LevelDB 資料庫大小縮減的問題 (levigo)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:stackoverflow。如有侵權,請聯絡admin@php.cn刪除
修改文件扩展名为.INI修改文件扩展名为.INIFeb 18, 2024 am 10:36 AM

如何更改文件类型为ini随着计算机的普及和应用软件的多样化,我们经常会遇到需要更改文件类型的情况。其中,将文件类型更改为.ini文件是一种常见的操作。本文将介绍如何简单快捷地将文件类型更改为.ini。首先,我们需要明确.ini文件的特点和用途。.ini文件是一种用于存储配置信息的文本文件。它通常以.ini作为扩展名,并包含键值对的形式。通过修改.ini文件中

在golang中获取JSON格式的x-www-form-urlencoded请求的嵌套键值对在golang中获取JSON格式的x-www-form-urlencoded请求的嵌套键值对Feb 09, 2024 pm 03:15 PM

我有一个用例,我们在x-www-form-urlencoded主体中获取嵌套键值,如下所示name=abc&age=12¬es[key1]=value1¬es[key2]=value2我尝试了url.parsequery("name=abc&age=12¬es\[key1\]=value1¬es\[key2\]=value2")但它给出了{"name":"abc","age":12,"notes[key1]":"value1","note

GO 中将 Map 转换为 List 的通用函数GO 中将 Map 转换为 List 的通用函数Feb 13, 2024 pm 08:30 PM

如何在go中编写一个函数,将任何map转换为对象列表(删除键)?例如:funcmaptolist(inputmapmap[any]any)any{varresultlist[]anyfor_,obj:=rangeinputmap{resultlist=append(resultlist,obj)}returnresultlist}funcmain(){mymap:=make(ma

当关系的一侧已存在于数据库中时,使用 SQLModel 插入多对多关系对象当关系的一侧已存在于数据库中时,使用 SQLModel 插入多对多关系对象Feb 06, 2024 am 08:00 AM

我正在尝试使用sqlmodel在数据库中插入记录,其中数据如下所示。一个house对象,它有颜色和许多位置。地点也将与许多房屋相关联。输入为:[{"color":"red","locations":[{"type":"country","name":"netherlands"},{"type":"municipality","name":"amsterdam"},

php数组键值对是什么php数组键值对是什么Aug 03, 2023 pm 02:20 PM

php数组键值对是一种数据结构,由一个键和一个相应的值组成,键是数组元素的标识符,而值是与键相关联的数据。允许我们以键为标识来存储和访问数据,通过使用键值对,可以更方便地操作和管理数组中的元素,使得程序开发更加灵活和高效。

在Java中使用枚举类型来赋值的方法在Java中使用枚举类型来赋值的方法Jan 31, 2024 pm 06:33 PM

什么是枚举类型?枚举类型(enum)是Java编程语言中的一种特殊数据类型,用于表示一组预定义的常量。枚举类型中的每个常量都代表该类型的一个可能值。如何使用枚举类型设置值?要使用枚举类型设置值,可以使用枚举类型的常量。枚举类型的常量可以通过点运算符(.)访问。例如,如果有一个名为Color的枚举类型,其中包含三个常量:RED、GREEN和BLUE

Python底层技术揭秘:如何实现哈希表Python底层技术揭秘:如何实现哈希表Nov 08, 2023 am 11:53 AM

Python底层技术揭秘:如何实现哈希表哈希表是在计算机领域中十分常见且重要的数据结构,它可以高效地存储和查找大量的键值对。在Python中,我们可以使用字典来使用哈希表,但是很少有人深入了解它的实现细节。本文将揭秘Python中哈希表的底层实现技术,并给出具体的代码示例。哈希表的核心思想是将键通过哈希函数映射到一个固定大小的数组中,而不是简单地按顺序存储。

Redis键值对操作在Java开发中的应用:如何快速存取数据Redis键值对操作在Java开发中的应用:如何快速存取数据Aug 01, 2023 am 09:36 AM

Redis键值对操作在Java开发中的应用:如何快速存取数据在Java开发中,数据的存取操作是一项非常重要的任务。如何快速、高效地存取数据是开发者所关注的一个重点问题。而Redis作为一种高性能的内存数据库,具备快速读写操作的特点,因此在Java开发中被广泛应用于数据缓存和存储实现。Redis是一个支持键值对存取的内存数据库。它将数据存储在内存中,因此数据的

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具