在Go中通过Mmap将数组映射到文件

我正在尝试通过Mmap将数组映射到文件,该数组可以是任何类型,例如float64。 在C语言中,我找到了一个。 阅读一些文本后,我写了这个示例。 我不知道它是否正确,并且没有将值写入文件。 如果我将数组的大小增加很多,例如从1000增加到10000,它将崩溃。 如果有人知道如何正确执行此操作,请告诉我。</ p>

谢谢!</ p>
</ div>

展开原文

原文

I'm trying to map an array to a file via Mmap, the array could be any type, like float64. In C, I find this one. After reading some texts, I wrote this sample. I don't know if it is correct, and it is not writing the values to the file. If I increase the size of array a lot, e.g from 1000 to 10000, it crashes. If someone know how to do that in the correctly way, please, tell me.

Thanks!

1个回答

For example, revising your sample program,

package main

import (
    "fmt"
    "os"
    "syscall"
    "unsafe"
)

func main() {
    const n = 1e3
    t := int(unsafe.Sizeof(0)) * n

    map_file, err := os.Create("/tmp/test.dat")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    _, err = map_file.Seek(int64(t-1), 0)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    _, err = map_file.Write([]byte(" "))
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    mmap, err := syscall.Mmap(int(map_file.Fd()), 0, int(t), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    map_array := (*[n]int)(unsafe.Pointer(&mmap[0]))

    for i := 0; i < n; i++ {
        map_array[i] = i * i
    }

    fmt.Println(*map_array)

    err = syscall.Munmap(mmap)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    err = map_file.Close()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
}
douyu9433
douyu9433 请注意,这仅是Unix。 Windows中的Go语言具有用于内存映射文件的不同api。
7 年多之前 回复
douiwn6941
douiwn6941 我认为是这样,但是他们可能正在运送自定义数学包,或者允许在批准的标准库中使用不安全的方法。 那绝对是一个好点,应该在某天尝试一下:)
8 年多之前 回复
doudang2537
doudang2537 我想知道是否可以使用例如 Go GAE中的数学包? 见链接
8 年多之前 回复
dongquelu1239
dongquelu1239 “安全”是什么意思? 它重铸了指针,因此需要“不安全”包。 如果未正确处理指针,则可能会崩溃(GAE不允许任何使用不安全软件包的软件包都首先使用)。 但是,如果正确处理它们,则可以编写快速有效的程序。 Russ Cox(Go的作者之一)的codesearch应用程序也大量使用了mmap,因此您可能想看看它来获得灵感。
8 年多之前 回复
douping1581
douping1581 谢谢,PeterSO,它正在工作。 您知道在Go中使用mmap是否安全吗?
8 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐