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

huangapple go评论172阅读模式
英文:

Mapping an array to a file via Mmap in Go

问题

我正在尝试通过Mmap将一个数组映射到一个文件中,这个数组可以是任何类型,比如float64。在C语言中,我找到了这个链接。在阅读了一些文本之后,我写了这个示例。我不知道它是否正确,并且它没有将值写入文件。如果我将数组的大小从1000增加到10000,程序会崩溃。如果有人知道正确的方法,请告诉我。

谢谢!

英文:

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

得分: 31

例如,修改您的示例程序,

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "syscall"
  6. "unsafe"
  7. )
  8. func main() {
  9. const n = 1e3
  10. t := int(unsafe.Sizeof(0)) * n
  11. map_file, err := os.Create("/tmp/test.dat")
  12. if err != nil {
  13. fmt.Println(err)
  14. os.Exit(1)
  15. }
  16. _, err = map_file.Seek(int64(t-1), 0)
  17. if err != nil {
  18. fmt.Println(err)
  19. os.Exit(1)
  20. }
  21. _, err = map_file.Write([]byte(" "))
  22. if err != nil {
  23. fmt.Println(err)
  24. os.Exit(1)
  25. }
  26. mmap, err := syscall.Mmap(int(map_file.Fd()), 0, int(t), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
  27. if err != nil {
  28. fmt.Println(err)
  29. os.Exit(1)
  30. }
  31. map_array := (*[n]int)(unsafe.Pointer(&mmap[0]))
  32. for i := 0; i < n; i++ {
  33. map_array[i] = i * i
  34. }
  35. fmt.Println(*map_array)
  36. err = syscall.Munmap(mmap)
  37. if err != nil {
  38. fmt.Println(err)
  39. os.Exit(1)
  40. }
  41. err = map_file.Close()
  42. if err != nil {
  43. fmt.Println(err)
  44. os.Exit(1)
  45. }
  46. }
英文:

For example, revising your sample program,

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;os&quot;
  5. &quot;syscall&quot;
  6. &quot;unsafe&quot;
  7. )
  8. func main() {
  9. const n = 1e3
  10. t := int(unsafe.Sizeof(0)) * n
  11. map_file, err := os.Create(&quot;/tmp/test.dat&quot;)
  12. if err != nil {
  13. fmt.Println(err)
  14. os.Exit(1)
  15. }
  16. _, err = map_file.Seek(int64(t-1), 0)
  17. if err != nil {
  18. fmt.Println(err)
  19. os.Exit(1)
  20. }
  21. _, err = map_file.Write([]byte(&quot; &quot;))
  22. if err != nil {
  23. fmt.Println(err)
  24. os.Exit(1)
  25. }
  26. mmap, err := syscall.Mmap(int(map_file.Fd()), 0, int(t), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
  27. if err != nil {
  28. fmt.Println(err)
  29. os.Exit(1)
  30. }
  31. map_array := (*[n]int)(unsafe.Pointer(&amp;mmap[0]))
  32. for i := 0; i &lt; n; i++ {
  33. map_array[i] = i * i
  34. }
  35. fmt.Println(*map_array)
  36. err = syscall.Munmap(mmap)
  37. if err != nil {
  38. fmt.Println(err)
  39. os.Exit(1)
  40. }
  41. err = map_file.Close()
  42. if err != nil {
  43. fmt.Println(err)
  44. os.Exit(1)
  45. }
  46. }

huangapple
  • 本文由 发表于 2012年2月9日 08:00:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/9203526.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定