作為我的Go教程的一部分,我正在編寫簡單的程序來計(jì)算多個(gè)文件中的單詞。我有一些go例程,用于處理文件和創(chuàng)建map[string]int告訴已發(fā)現(xiàn)特定單詞的次數(shù)。然后將映射發(fā)送到約簡例程,該例程將值聚合到單個(gè)映射中。聽起來很簡單,看起來像Go的完美任務(wù)(減少地圖操作)!我大約有1萬個(gè)文檔,其中包含160萬個(gè)唯一單詞。我發(fā)現(xiàn)我的內(nèi)存使用量在運(yùn)行代碼時(shí)快速且持續(xù)地增長,而我的內(nèi)存用完了大約一半的處理時(shí)間(12GB盒裝,7GB可用空間)。所以是的,它為這個(gè)小數(shù)據(jù)集使用了千兆字節(jié)!試圖找出問題出在哪里,我發(fā)現(xiàn)歸咎于reduceer收集和匯總數(shù)據(jù)。代碼如下:func reduceWords (input chan map[string]int, output chan int) { total := make(map[string]int) for wordMap := range input { for w, c := range wordMap { total[w] += c } } output <- len(total)}如果我從樣本上方刪除地圖,則內(nèi)存將保持在合理的范圍內(nèi)(幾百兆字節(jié))。不過,我發(fā)現(xiàn)對字符串進(jìn)行復(fù)制也可以解決問題,即以下示例不會占用我的內(nèi)存:func reduceWords (input chan map[string]int, output chan int) { total := make(map[string]int) for wordMap := range input { for w, c := range wordMap { copyW := make([]byte, len(w)) // <-- will put a copy here! copy(copyW, w) total[string(copyW)] += c } } output <- len(total)}wordMap當(dāng)我直接使用該值時(shí),是否有可能是實(shí)例在每次迭代后都沒有被破壞?(作為C ++程序員,在使用GC時(shí)我的直覺很有限。)這是否值得期待?難道我做錯(cuò)了什么?我應(yīng)該對Go還是對自己感到失望?
1 回答

胡說叔叔
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
您的代碼看起來像什么,將文件轉(zhuǎn)換為字符串?我在那里找問題。如果要將大塊(可能是整個(gè)文件?)轉(zhuǎn)換為字符串,然后將其切成單詞,那么如果保存任何一個(gè)單詞,則將固定整個(gè)塊。嘗試將塊保留為[] byte,將其切成單詞,然后將單詞分別轉(zhuǎn)換為字符串類型。
- 1 回答
- 0 關(guān)注
- 213 瀏覽
添加回答
舉報(bào)
0/150
提交
取消