Maison > Article > développement back-end > Problèmes avec la réduction de la taille de la base de données LevelDB dans Go (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.
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.") }
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.") }
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 :
Toute idée ou conseil pour résoudre ce problème serait grandement apprécié. Merci!
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!