2012-02-09 11 views
19

Sto provando a mappare una matrice in un file tramite Mmap, l'array potrebbe essere di qualsiasi tipo, come float64. In C, trovo questo one. Dopo aver letto alcuni testi, ho scritto questo sample. Non so se è corretto, e non sta scrivendo i valori nel file. Se aumento molto la dimensione della matrice, ad esempio da 1000 a 10000, si arresta in modo anomalo. Se qualcuno sa come farlo nel modo corretto, per favore, dimmi.Mappare una matrice in un file tramite Mmap in Go

Grazie!

risposta

25

Per esempio, rivedere il vostro programma di esempio,

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

Grazie, PeterSO, sta funzionando. Sai se è sicuro usare mmap in Go? – tfmoraes

+5

Cosa intendi con "sicuro"? Ricalcola i puntatori e richiede quindi il pacchetto "non sicuro". Se non gestisci correttamente i puntatori, potrebbe bloccarsi (e GAE non consente alcun pacchetto che utilizza il pacchetto non sicuro in primo luogo). Ma se li gestisci correttamente, puoi scrivere programmi veloci ed efficienti. Anche l'app [codesearch] (http://code.google.com/p/codesearch/) di Russ Cox (uno degli autori di Go) usa molto mmap, quindi potresti dare un'occhiata a questo per ispirazione. – tux21b

+1

@ tux21b: mi chiedo se è possibile utilizzare per es. il pacchetto matematico in Go GAE? Vedi [link] (http://golang.org/src/pkg/math/unsafe.go) – zzzz