Der PHP-Editor Strawberry stellt Ihnen das Problem „Panik tritt beim Schreiben von durch mmap zugewiesenen Slices“ vor. Wenn Sie mmap zum Zuweisen von Speicher verwenden und gleichzeitig Schreibvorgänge ausführen, kann es zu einer Panik bei der Speicherzuweisung kommen. In diesem Fall kann es zu unerwarteten Fehlern oder sogar zum Programmabsturz kommen. Daher müssen Sie bei der Verwendung von mmap zum Zuweisen von Speicher darauf achten, gleichzeitige Schreibvorgänge zu vermeiden, oder andere Speicherzuweisungsmethoden verwenden, um dieses Problem zu vermeiden. Als nächstes werden wir dieses Problem im Detail analysieren und entsprechende Lösungen anbieten.
Das Szenario besteht darin, Echtzeit-Streaming-Daten in einem dateigestützten Speicherbereich zwischenzuspeichern. Ziel ist es, mit mmap
den Zustand fehlertolerant zu machen.
Durch die Verwendung von mmap
in Ihrer Anwendung müssen Sie sich nicht mehr auf den Redis-Schlüsselwertspeicher verlassen.
Hier ist die Vorgehensweise:
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
Warum kann mmap[0] = 'X'
keine Daten in eine Datei schreiben? mmap[0] = 'X'
无法将数据写入文件?
您的文件是空的,因此您的切片也是空的。您必须首先为文件分配一些字节,然后尝试更改从 mmap.Map()
或 mmap.MapRegion()
initFile()
中创建的文件不是人类可读的,您可以制作一个固定大小的字符串,然后将其写入文件,这样您的 mem
Ihre Datei ist leer, daher sind auch Ihre Slices leer. Sie müssen der Datei zunächst einige Bytes zuweisen und dann versuchen, den Slice zu ändern, den Sie von mmap.Map()
oder mmap.MapRegion()
erhalten:
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() }
Das obige ist der detaillierte Inhalt vonBeim Schreiben in das MMAP-zugeteilte Slice kommt es zu Panik. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!