Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh membaca dan menulis fail CSV dengan cekap dalam Go menggunakan concurrency?

Bagaimanakah saya boleh membaca dan menulis fail CSV dengan cekap dalam Go menggunakan concurrency?

DDD
DDDasal
2024-11-02 20:40:03223semak imbas

How can I efficiently read and write CSV files in Go using concurrency?

CSV Baca dan Tulis yang Cekap dalam Go

Tugas membaca dan menulis fail CSV dengan cekap dalam Go melibatkan pengoptimuman operasi I/O . Pertimbangkan coretan kod berikut yang membaca fail CSV, melakukan pengiraan pada data dan menulis keputusan ke fail CSV baharu:

<code class="go">package main

import (
  "encoding/csv"
  "fmt"
  "log"
  "os"
  "strconv"
)

func ReadRow(r *csv.Reader) (map[string]string, error) {
  record, err := r.Read()
  if err == io.EOF {
    return nil, io.EOF
  }
  if err != nil {
      return nil, err
  }
  m := make(map[string]string)
  for i, v := range record {
    m[strconv.Itoa(i)] = v
  }
  return m, nil
}

func main() {
  // load data csv
  csvFile, err := os.Open("./path/to/datafile.csv")
  if err != nil {
    log.Fatal(err)
  }
  defer csvFile.Close()

  // create channel to process rows concurrently
  recCh := make(chan map[string]string, 10)
  go func() {
    defer close(recCh)
    r := csv.NewReader(csvFile)
    if _, err := r.Read(); err != nil { //read header
        log.Fatal(err)
    }

    for {
        rec, err := ReadRow(r)
        if err == io.EOF {
          return  // no more rows to read
        }
        if err != nil {
          log.Fatal(err)
        }
        recCh <- rec
    }
  }()

  // write results to a new csv
  outfile, err := os.Create("./where/to/write/resultsfile.csv"))
  if err != nil {
    log.Fatal("Unable to open output")
  }
  defer outfile.Close()
  writer := csv.NewWriter(outfile)

  for record := range recCh {
    time := record["0"]
    value := record["1"]

    // get float values
    floatValue, err := strconv.ParseFloat(value, 64)
    if err != nil {
      log.Fatal("Record: %v, Error: %v", floatValue, err)
    }

    // calculate scores; THIS EXTERNAL METHOD CANNOT BE CHANGED
    score := calculateStuff(floatValue)

    valueString := strconv.FormatFloat(floatValue, 'f', 8, 64)
    scoreString := strconv.FormatFloat(prob, 'f', 8, 64)
    //fmt.Printf("Result: %v\n", []string{time, valueString, scoreString})

    writer.Write([]string{time, valueString, scoreString})
  }

  writer.Flush()
}</code>

Peningkatan utama dalam kod ini ialah penggunaan konkurensi untuk memproses CSV baris satu demi satu. Dengan menggunakan saluran, kita boleh membaca baris daripada fail CSV input dalam goroutine dan menulis hasilnya pada fail CSV output dalam rutin utama secara serentak. Pendekatan ini mengelakkan memuatkan keseluruhan fail ke dalam memori, yang boleh mengurangkan penggunaan memori dan meningkatkan prestasi dengan ketara.

Atas ialah kandungan terperinci Bagaimanakah saya boleh membaca dan menulis fail CSV dengan cekap dalam Go menggunakan concurrency?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn