2016-04-05 33 views
0

私たちは大きなデータセットを持っています - 数十のcsvファイルのカップル、それぞれ〜130Gbです。 csvテーブルでSQLクエリをエミュレートする必要があります。巨大なcsvファイルを扱う

テスト1.1Gbファイルでencoding/csvを使用してテストテーブルを読み込んでいるとき、プログラムは526Gbの仮想メモリを割り当てます。どうして? csv.Readerは、reader.Read()メソッドを使用しているとき、ジェネレータのように動作するか、またはメモリに行を保持しますか?

完全codecodereviewの後。

UPD

は以下のようにファイルを読む:メモリエラーとラインrecord, err := r.Read()に落ちる

rf, err := os.Open(input_file) 
if err != nil { 
    log.Fatal("Error: %s", err) 
} 
r := csv.NewReader(rf) 
for { 
    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

改行コードと改行コードを確認し、それらの文字がどこにあるかのサンプルデータを投稿してください。 – eduncan911

答えて

4

ほとんどの改行が検出されておらず、単一のレコードとしての読書すべて。

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

あなたは210行目にコードに従った場合、あなたはそれが'\n'を探して表示されます。

実際に間違っているとWindowsスマートになっていると思って、システムによってエクスポートされたときに改行が\n\rと定義されていることがよくあります。正しいWindows改行は\r\nです。

また、あなたはあなたがあなたの入力を持っているどんな技術使用するためのラインをdeliminateするカスタムScannerを書き、あなたのcsv.Readerためio.Readerの入力として使用することができます。たとえば、上記の無効な\n\rを使用するとします。

関連する問題