Go での CSV データの効率的な読み取りと書き込み
提供されている Go コードは、10,000 レコードを含む大きな CSV ファイルを読み取り、計算を実行し、次に、元の値をスコア列を追加して別の CSV に書き込みます。ただし、このプロセスは遅く、完了するまでに数時間かかります。この記事では、コードを最適化するための CSV の読み取りおよび書き込み操作における潜在的な非効率性を調査します。
重要な最適化の 1 つは、ファイル全体を一度にメモリに読み込まないようにすることです。元のコードは ReadAll() を使用してすべてのレコードをスライスに読み取りますが、これは大きなファイルの場合は効率的ではありません。代わりに、ファイルが一度に 1 行ずつ処理されるストリーミング アプローチが推奨されます。
これを実装するには、ゴルーチンを使用して CSV ファイルを 1 行ずつ読み取り、レコードをチャネルに送信します。メインの goroutine は、チャネルからのレコードを使用し、計算を実行し、結果を出力 CSV に書き込むことができます。以下に実装例を示します。
<code class="go">func processCSV(rc io.Reader) (ch chan []string) { ch = make(chan []string, 10) go func() { r := csv.NewReader(rc) if _, err := r.Read(); err != nil { //read header log.Fatal(err) } defer close(ch) for { rec, err := r.Read() if err != nil { if err == io.EOF { break } log.Fatal(err) } ch <- rec } }() return }</code>
このコードでは、processCSV() 関数はリーダーを受け取り、CSV ファイルからレコードを出力するチャネルを返します。メインの goroutine は、このチャネルを使用してレコードを効率的に処理および書き込みできます。
このストリーミング アプローチを使用すると、CSV の読み取りおよび書き込み操作のパフォーマンスが大幅に向上し、大規模な処理のコードの効率が向上します。 CSV ファイル。
以上がGo で大きな CSV ファイルを効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。