2012-02-09 26 views
19

Bir diziyi Mmap ile bir dosyaya eşlemeye çalışıyorum, dizi float64 gibi herhangi bir türde olabilir. C içinde, bu one buluyorum. Bazı metinleri okuduktan sonra, bu sample yazdım. Doğru olup olmadığını bilmiyorum ve değerleri dosyaya yazmıyor. Eğer dizinin büyüklüğünü çok fazla artırırsam, örneğin 1000'den 10000'e, o çöker. Birisi bunu doğru şekilde nasıl yapacağını biliyorsa, lütfen, söyle.Mmap ile Git bir dizi dosyaya eşleme

Teşekkürler!

cevap

25
Örneğin

, örnek programı revize,

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

sayesinde PeterSO, işe yarıyor. Go'da mmap'i kullanmanın güvenli olup olmadığını biliyor musunuz? – tfmoraes

+5

"Güvenli" ile ne demek istiyorsun? İşaretçileri yeniden adlandırır ve bu nedenle "güvenli olmayan" paketi gerektirir. İşaretçileri doğru şekilde kullanmazsanız, çökebilir (ve GAE, ilk etapta güvenli olmayan paketi kullanan paketlere izin vermez). Ancak bunları doğru şekilde kullanırsanız, hızlı ve verimli programlar yazabilirsiniz. Russ Cox'un (Go yazarlarından biri) [codeearch] (http://code.google.com/p/codesearch/) uygulaması da mmap'i çok kullanıyor, bu yüzden ilham almak için bir göz atmak isteyebilirsiniz. – tux21b

+1

@ tux21b: Acaba bir kişi kullanabilir miyim? Go GAE'deki matematik paketi? Bkz. [Link] (http://golang.org/src/pkg/math/unsafe.go) – zzzz