Maison > développement back-end > Golang > Écrire dans des paniques de tranche allouées par mmap

Écrire dans des paniques de tranche allouées par mmap

WBOY
Libérer: 2024-02-09 09:00:12
avant
804 Les gens l'ont consulté

写入 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.

Contenu de la question

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()
}
Copier après la connexion
<小时/>
$ 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
Copier après la connexion
<小时/>

Pourquoi mmap[0] = 'X' ne peut pas écrire de données dans un fichier ? mmap[0] = 'X' 无法将数据写入文件?

解决方法

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

Solution

initFile() 中创建的文件不是人类可读的,您可以制作一个固定大小的字符串,然后将其写入文件,这样您的 memVotre 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()
}
Copier après la connexion
🎜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!

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