2016-04-05 105 views
0

我們有大數據集 - 幾十個csv文件,大約130Gb。 我們必須在csv表上模擬sql查詢。去。處理大量的csv文件

當我們在測試1.1讀取測試表時使用encoding/csv Gb文件 - 程序分配526 Gb的虛擬內存。爲什麼? csv.Reader像發電機一樣工作,當我們使用reader.Read()方法時,或者它將行保存在內存中?

Full codecodereview之後。

UPD

閱讀文件,如:

rf, err := os.Open(input_file) 
if err != nil { 
    log.Fatal("Error: %s", err) 
} 
r := csv.NewReader(rf) 
for { 
    record, err := r.Read() 
} 

落上線record, err := r.Read()與內存錯誤。在讀取過程中的內存

UPD2 快照:

2731.44MB 94.63% 94.63% 2731.44MB 94.63% encoding/csv.(*Reader).parseRecord 
    151MB 5.23% 99.86% 2885.96MB 100% main.main 
     0  0% 99.86% 2731.44MB 94.63% encoding/csv.(*Reader).Read 
     0  0% 99.86% 2886.49MB 100% runtime.goexit 
     0  0% 99.86% 2886.49MB 100% runtime.main 
+0

SO不是代碼評論網站。使用相關代碼片段以及樣本輸入數據更新您的問題。 – eduncan911

+0

@ eduncan911,附帶相關代碼問題。 –

+0

檢查你的數據的換行符和CR字符代碼,併發布這些字符的地方的一些示例數據。 – eduncan911

回答

4

最有可能沒有被檢測到的換行和讀碟一切作爲一個單一的記錄。

https://golang.org/src/encoding/csv/reader.go?s=4071:4123#L124

如果按照代碼線210,你會看到它尋找'\n'

當有些系統導出它時,我經常會看到換行符定義爲\n\r,認爲它們在Windows中很聰明,實際上它是錯誤的。正確的Windows linebreak是\r\n

或者,您可以編寫自定義Scanner將deliminate行你使用你在你輸入的任何技術,並把它作爲io.Reader輸入您csv.Reader。例如,要使用上面提到的無效的\n\r