2017-02-15 48 views
-3

我有一个大的.json文件,大约有2MB。我使用this code阅读JSON,用少许修改:为什么我的Go程序使用打开文件的名称创建另一个Go进程,以及它为什么如此之大?

func main() { 
    pages := getPages() 
    for { 

    } 
    for _, p := range pages { 
     fmt.Println(p.toString()) 
    } 

正如你所看到的,我已经把一个无限循环,所以我可以使程序等待,而我读的过程中的RAM大小。当我读完它时,我发现有2个程序正在运行。我只是做了

go run myfile.go

但后来我得到了2个二进制文件:一个名为go,和其他与不json的部分文件名。 go二进制文件有5mb,但是这个文件有36mb ...

为什么go会使用文件的名称创建另一个进程?它是在哪里持有的文件,所以我可以读?它为什么这样做?据我所知,文件阅读应由操作系统提交。为什么它与.json大小相比如此之大?

此外,不应该,当getPages()返回时,由于去垃圾收集器,文件对象和json对象都从内存中删除?

+2

没有睡眠的无限循环或任何是一个坏主意,它会消耗大量的CPU。该文件是否由URL指向您正在使用的确切代码? –

+0

除非您回复 –

+0

的评论,否则很难帮到您,但后来我得到了2个二进制文件:一个名为go,另一个文件的名称不带json部分。 go二进制文件有5mb,但是这个文件有36mb ... 'go run'不会在工作目录中创建二进制文件 –

回答

4

为什么go会用文件的名称创建另一个进程?

它没有。你做到了。当你这样做时go run main.go你正在运行go程序,它将你的main.go编译成一个不同的可执行文件(你记得Go是一种编译语言,生成本机可执行文件?)并执行第二个可执行文件。你告诉go工具要这么做,它的行为就像告诉的那样。如果你不喜欢:go build -o whatever; ./whatever

另外,不应该,当getPages()返回时,文件对象和json对象从内存中删除,因为去的垃圾收集器?

是的,这实际上发生。它只是不可观察的方式,你试图检查它。 Go中的内存管理很复杂,与OS的内存管理的相互作用很复杂(取决于操作系统),操作系统内存管理也很复杂。

非常粗略地说:Go GC收集了未引用的对象,但是由于从操作系统“返回”和“重新获取”内存是非常昂贵的操作,因此内存不会“返回”到操作系统不会“返回”到操作系统(除非需要)。

如果您觉得内存管理的血淋淋的细节令您感兴趣,请在搜索结果或网页中搜索“去不释放内存”。

相关问题