2016-08-29 2 views
1

float32値を含む非常に大きなファイルをメモリにマップするために、mmapを使用するGoプログラムを作成しようとしています。これは、次のエラーメッセージで失敗しGo:unsafe.Pointerを未知の長さの配列へのポインタに変換する方法は?

package main 

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

func main() { 
    fileName := "test.dat" 
    info, _ := os.Stat(fileName) 
    fileSize := info.Size() 
    n := int(fileSize/4) 

    mapFile, _ := os.Open(fileName) 
    defer mapFile.Close() 
    mmap, _ := syscall.Mmap(int(mapFile.Fd()), 0, int(fileSize), 
     syscall.PROT_READ, syscall.MAP_SHARED) 
    defer syscall.Munmap(mmap) 
    mapArray := (*[n]float32)(unsafe.Pointer(&mmap[0])) 

    for i := 0; i < n; i++ { 
     fmt.Println(mapArray[i]) 
    } 
} 

n以来

./main.go:21: non-constant array bound n 

は、ファイルの長さによって決定される(ここで(、エラー処理が簡略化のために省略previous answerに触発された)私の試みですコンパイル時にはわかりません)、キャスト内の定数値にnを置き換えることはできません。 mmapfloat32値の配列(またはスライス)に変換するにはどうすればよいですか?

答えて

2

まず、データに適した静的長さのタイプの配列に変換し、その配列を正しい長さと容量にスライスします。

mapSlice := (*[1 << 30]float32)(unsafe.Pointer(&mmap[0]))[:n:n] 
関連する問題