首頁 > 後端開發 > Golang > 主體

寫入 mmap 分配的切片會發生恐慌

WBOY
發布: 2024-02-09 09:00:12
轉載
759 人瀏覽過

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

php小編草莓將為大家介紹關於"寫入 mmap 分配的切片會發生恐慌"的問題。在使用 mmap 分配記憶體時,如果同時進行寫入操作,可能會引發記憶體分配的恐慌。在這種情況下,程式可能會出現無法預料的錯誤,甚至導致程式崩潰。因此,在使用 mmap 分配記憶體時,需要注意避免同時進行寫入操作,或採用其他的記憶體分配方式來規避這個問題。接下來,我們將為大家詳細解析這個問題,並提供對應的解決方案。

問題內容

場景是將即時串流資料快取到檔案支援的記憶體映射區域。目標是使用 mmap 使狀態容錯。

在應用程式中使用 mmap 將避免依賴 Redis 鍵值儲存。

下面是程式:

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
登入後複製
<小时/>

為什麼 mmap[0] = 'X' 無法將資料寫入檔案?

解決方法

您的檔案是空的,因此您的切片也是空的。您必須先為檔案指派一些位元組,然後嘗試變更從 mmap.Map()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()
}
登入後複製

請注意,在initFile() 中建立的文件不是人類可讀的,您可以製作一個固定大小的字串,然後將其寫入文件,這樣您的mem 的內容變成人類可讀的

以上是寫入 mmap 分配的切片會發生恐慌的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!