Maison > développement back-end > Golang > le corps du texte

Problèmes avec la réduction de la taille de la base de données LevelDB dans Go (levigo)

王林
Libérer: 2024-02-11 11:06:10
avant
783 Les gens l'ont consulté

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

l'éditeur php Youzi vous présentera les problèmes de réduction de taille et les solutions qui peuvent être rencontrés lors de l'utilisation de la base de données LevelDB dans Go. LevelDB est une base de données clé-valeur hautes performances, mais lors du traitement de grandes quantités de données, la taille de la base de données peut croître rapidement et occuper une grande quantité d'espace de stockage. L'article expliquera en détail comment résoudre ce problème en utilisant la bibliothèque Levigo et en utilisant des algorithmes de compression pour réduire la taille de la base de données, améliorant ainsi les performances et économisant de l'espace de stockage. Que vous soyez débutant ou développeur expérimenté, cet article vous aidera.

Contenu des questions

Bonjour la communauté Stack Overflow,

Je développe actuellement un programme Go qui utilise LevelDB pour le stockage de données à l'aide du package Levigo. Mon objectif est de gérer efficacement la taille de la base de données, en supprimant spécifiquement les anciens enregistrements lorsque le stockage disponible est faible. Cependant, j'ai observé un comportement inattendu : la taille du dossier de la base de données LevelDB n'a pas diminué proportionnellement après la suppression des enregistrements.

Voici une version simplifiée du code qui reproduit le problème :

Enregistrer le code des données :

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.")
}
Copier après la connexion

Supprimer le code de données :

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.")
}
Copier après la connexion

Après avoir exécuté le code pour enregistrer 5 éléments, la taille du dossier de base de données est de 30 Mo. Plus tard, lorsque j'ai exécuté le code pour supprimer 3 éléments, la taille du dossier a été réduite à 26 Mo. Compte tenu de la quantité de données supprimées, je m'attendais à ce que la taille soit réduite de manière plus significative.

J'ai configuré des options LevelDB, telles que la taille du cache et les limites de fichiers, mais il semble que j'ai peut-être manqué quelque chose lors de la configuration ou de la suppression.

Question :

  1. Qu'est-ce qui pourrait empêcher la taille du dossier de la base de données LevelDB de diminuer proportionnellement après la suppression des enregistrements ?
  2. Y a-t-il d'autres configurations ou optimisations que je devrais envisager afin de gérer plus efficacement la taille de la base de données ?
  3. Existe-t-il un moyen spécifique dans Levigo pour compacter la base de données afin de libérer de l'espace inutilisé ?

Toute idée ou conseil pour résoudre ce problème serait grandement apprécié. Merci!

Solution

En lisant ce numéro sur level DB deposit, j'ai réalisé que je pouvais ajouter ceci pour supprimer la ligne à la fin de la boucle db.CompactRange(levigo.Range{})
Ainsi, la base de données supprimera les données inutilisées et la taille totale du dossier de la base de données sera réduite.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!