【发布时间】:2014-08-03 05:47:32
【问题描述】:
我有一个非常非常大的地图数组(不是切片),然后我正在尝试对其进行编码。我确实需要避免制作数组的副本,但我不知道该怎么做。
到目前为止,我有这个:
func doSomething() {
var mygiantvar [5]map[string]Searcher
mygiantvar = Load()
Save(`file.gob.gz`, &mygiantvar)
}
func Save(filename string, variable *[5]map[string]Searcher) error {
// Open file for writing
fi, err := os.Create(filename)
if err !=nil {
return err
}
defer fi.Close()
// Attach gzip writer
fz := gzip.NewWriter(fi)
defer fz.Close()
// Push from the gob encoder
encoder := gob.NewEncoder(fz)
err = encoder.Encode(*variable)
if err !=nil {
return err
}
return nil
}
据我了解,这会将 mygiantvar 的指针传递给 Save,它会保存第一个副本。但是整个数组肯定会被复制到 encoder.Encode 中,然后它会复制更多的函数,对吧?
这个mygiantvar 变量的大小大约为 10GB。所以它必须避免被复制。
但话又说回来,也许只有实际的数组 [5] 部分被复制,但其中的映射是数组内的指针,因此将复制指向映射的指针数组而不是映射本身?我对此一无所知 - 这一切都非常令人困惑。
有什么想法吗?
【问题讨论】: