私たちは大きなデータセットを持っています - 数十の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
SOはコードレビューサイトではありません。相対コードスニペットとサンプル入力データで質問を更新してください。 – eduncan911
@ eduncan911、質問に関連するコードが添付されています。 –
改行コードと改行コードを確認し、それらの文字がどこにあるかのサンプルデータを投稿してください。 – eduncan911