2017-02-15 45 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收集了未引用的對象,但是由於從操作系統「返回」和「重新獲取」內存是非常昂貴的操作,因此內存不會「返回」到操作系統不會「返回」到操作系統(除非需要)。

如果您覺得內存管理的血淋淋的細節令您感興趣,請在搜索結果或網頁中搜索「去不釋放內存」。

相關問題