Heim > Backend-Entwicklung > Golang > Beim Schreiben in das MMAP-zugeteilte Slice kommt es zu Panik

Beim Schreiben in das MMAP-zugeteilte Slice kommt es zu Panik

WBOY
Freigeben: 2024-02-09 09:00:12
nach vorne
802 Leute haben es durchsucht

写入 mmap 分配的切片会发生恐慌

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.

Frageninhalt

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()
}
Nach dem Login kopieren
<小时/>
$ 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
Nach dem Login kopieren
<小时/>

Warum kann mmap[0] = 'X' keine Daten in eine Datei schreiben? mmap[0] = 'X' 无法将数据写入文件?

解决方法

您的文件是空的,因此您的切片也是空的。您必须首先为文件分配一些字节,然后尝试更改从 mmap.Map()mmap.MapRegion()

Problemumgehung

initFile() 中创建的文件不是人类可读的,您可以制作一个固定大小的字符串,然后将其写入文件,这样您的 memIhre 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()
}
Nach dem Login kopieren
🎜Bitte beachten Sie, dass der darin enthaltene Inhalt 🎜 für Menschen lesbar wird🎜

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage