Isu dengan pengurangan saiz pangkalan data LevelDB dalam Go (levigo)

王林
Lepaskan: 2024-02-11 11:06:10
ke hadapan
784 orang telah melayarinya

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

editor php Youzi akan memperkenalkan anda kepada masalah pengurangan saiz dan penyelesaian yang mungkin dihadapi apabila menggunakan pangkalan data LevelDB dalam Go. LevelDB ialah pangkalan data nilai kunci berprestasi tinggi, tetapi apabila memproses sejumlah besar data, saiz pangkalan data mungkin berkembang pesat dan menduduki sejumlah besar ruang storan. Artikel ini akan membincangkan secara terperinci cara menyelesaikan masalah ini dengan menggunakan perpustakaan levigo dan menggunakan algoritma pemampatan untuk mengurangkan saiz pangkalan data, dengan itu meningkatkan prestasi dan menjimatkan ruang storan. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan membantu anda.

Kandungan soalan

Hello komuniti Stack Overflow,

Saya sedang membangunkan program Go yang menggunakan LevelDB untuk penyimpanan data menggunakan pakej levigo. Matlamat saya adalah untuk mengurus saiz pangkalan data dengan cekap, khususnya memadam rekod lama apabila storan yang tersedia adalah rendah. Walau bagaimanapun, saya melihat tingkah laku yang tidak dijangka: saiz folder pangkalan data LevelDB tidak berkurangan secara berkadar selepas memadamkan rekod.

Berikut ialah versi ringkas kod yang menghasilkan semula isu:

Simpan kod data:

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.")
}
Salin selepas log masuk

Padam kod data:

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.")
}
Salin selepas log masuk

Selepas menjalankan kod untuk menyimpan 5 item, saiz folder pangkalan data ialah 30MB. Kemudian, apabila saya menjalankan kod untuk memadam 3 item, saiz folder telah dikurangkan kepada 26MB. Memandangkan jumlah data yang dialih keluar, saya menjangkakan saiznya akan dikurangkan dengan lebih ketara.

Saya telah menyediakan pilihan LevelDB, seperti saiz cache dan had fail, tetapi nampaknya saya mungkin terlepas sesuatu semasa konfigurasi atau pengalihan keluar.

Soalan:

  1. Apakah yang boleh menyebabkan saiz folder pangkalan data LevelDB tidak berkurangan secara berkadar selepas memadamkan rekod?
  2. Adakah terdapat sebarang konfigurasi atau pengoptimuman lain yang perlu saya pertimbangkan untuk mengurus saiz pangkalan data dengan lebih cekap?
  3. Adakah terdapat cara khusus dalam levigo untuk memampatkan pangkalan data untuk mengosongkan ruang yang tidak digunakan?

Sebarang pandangan atau panduan untuk menyelesaikan isu ini amat dihargai. Terima kasih!

Penyelesaian

Dengan membaca isu ini pada repositori DB peringkat, saya menyedari bahawa saya boleh menambah ini untuk memadamkan baris di penghujung gelung db.CompactRange(levigo.Range{})
Jadi pangkalan data akan memadam data yang tidak digunakan dan jumlah saiz folder pangkalan data akan dikurangkan.

Atas ialah kandungan terperinci Isu dengan pengurangan saiz pangkalan data LevelDB dalam Go (levigo). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!