2012-02-09 26 views
19

Tôi đang cố gắng ánh xạ một mảng tới một tệp qua Mmap, mảng có thể là bất kỳ loại nào, như float64. Trong C, tôi tìm thấy số này one. Sau khi đọc một số văn bản, tôi đã viết này sample. Tôi không biết nếu nó là chính xác, và nó không phải là viết các giá trị cho tập tin. Nếu tôi tăng kích thước của mảng rất nhiều, ví dụ: từ 1000 đến 10000, nó sẽ bị treo. Nếu ai đó biết làm thế nào để làm điều đó một cách chính xác, xin vui lòng, cho tôi biết.Ánh xạ một mảng vào một tệp qua Mmap trong Go

Cảm ơn!

Trả lời

25

Ví dụ, sửa đổi chương trình mẫu của bạn,

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) 
    } 
} 
+1

Cảm ơn, PeterSO, nó làm việc. Bạn có biết nếu nó an toàn để sử dụng mmap trong Go? – tfmoraes

+5

Bạn có ý nghĩa gì với "an toàn"? Nó khôi phục lại con trỏ và do đó yêu cầu gói "không an toàn". Nếu bạn không xử lý đúng con trỏ, nó có thể bị lỗi (và GAE không cho phép bất kỳ gói nào sử dụng gói không an toàn ở địa điểm đầu tiên). Nhưng nếu bạn xử lý chúng một cách chính xác, bạn có thể viết các chương trình nhanh và hiệu quả. Ứng dụng [codesearch] (http://code.google.com/p/codesearch/) của Russ Cox (một trong những tác giả Go) cũng sử dụng nhiều mmap, vì vậy bạn có thể muốn xem xét điều đó để lấy cảm hứng. – tux21b

+1

@ tux21b: Tôi tự hỏi liệu người ta có thể sử dụng ví dụ: gói toán học trong Go GAE? Xem [link] (http://golang.org/src/pkg/math/unsafe.go) – zzzz

Các vấn đề liên quan