Maison >développement back-end >Golang >Écrire dans des paniques de tranche allouées par mmap
L'éditeur PHP Strawberry vous présentera le problème de "la panique se produit lors de l'écriture des tranches allouées par mmap". Lors de l'utilisation de mmap pour allouer de la mémoire, si les opérations d'écriture sont effectuées en même temps, une panique d'allocation de mémoire peut se produire. Dans ce cas, le programme peut contenir des erreurs imprévisibles ou même provoquer un blocage du programme. Par conséquent, lorsque vous utilisez mmap pour allouer de la mémoire, vous devez faire attention à éviter les opérations d'écriture simultanées ou utiliser d'autres méthodes d'allocation de mémoire pour éviter ce problème. Ensuite, nous analyserons ce problème en détail et proposerons les solutions correspondantes.
Le scénario consiste à mettre en cache les données de streaming en temps réel dans une zone mappée en mémoire sauvegardée sur fichier. Le but est d'utiliser mmap
pour rendre l'état tolérant aux pannes.
L'utilisation de mmap
dans votre application évitera de dépendre du magasin clé-valeur Redis.
Voici la procédure :
package main import ( "fmt" "os" "github.com/edsrzf/mmap-go" ) func main() { f, _ := os.OpenFile("./file", os.O_RDWR, 0644) defer f.Close() mmap, _ := mmap.Map(f, mmap.RDWR, 0) defer mmap.Unmap() fmt.Println(string(mmap)) mmap[0] = 'X' mmap.Flush() }
$ go build -gcflags -m=2 -o main cmd/layer/main.go $ ./main panic: runtime error: index out of range [0] with length 0 goroutine 1 [running]: main.main() /..//cmd/layer/main.go:21 +0x1d7
Pourquoi mmap[0] = 'X'
ne peut pas écrire de données dans un fichier ? mmap[0] = 'X'
无法将数据写入文件?
您的文件是空的,因此您的切片也是空的。您必须首先为文件分配一些字节,然后尝试更改从 mmap.Map()
或 mmap.MapRegion()
initFile()
中创建的文件不是人类可读的,您可以制作一个固定大小的字符串,然后将其写入文件,这样您的 mem
Votre fichier est vide, donc vos tranches sont également vides. Vous devez d'abord allouer quelques octets au fichier, puis essayer de changer la tranche que vous obtenez de mmap.Map()
ou mmap.MapRegion()
:
package main import ( "os" "github.com/edsrzf/mmap-go" ) var testPath = "./file" func initFile() { size := int64(10 * 1024 * 1024) fd, err := os.Create(testPath) if err != nil { panic("Failed to create output") } _, err = fd.Seek(size-1, 0) if err != nil { panic("Failed to seek") } _, err = fd.Write([]byte{0}) if err != nil { panic("Write failed") } err = fd.Close() if err != nil { panic("Failed to close file") } } func main() { f, _ := os.OpenFile("./file", os.O_RDWR, 0644) defer f.Close() mem, _ := mmap.Map(f, mmap.RDWR, 0) defer mem.Unmap() mem[0] = 'X' mem.Flush() }🎜Veuillez noter que le contenu de 🎜 devient lisible par l'homme🎜
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!