>  기사  >  백엔드 개발  >  동시성을 사용하여 Go에서 어떻게 효율적으로 CSV 파일을 읽고 쓸 수 있나요?

동시성을 사용하여 Go에서 어떻게 효율적으로 CSV 파일을 읽고 쓸 수 있나요?

DDD
DDD원래의
2024-11-02 20:40:03223검색

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

Go에서 효율적인 CSV 읽기 및 쓰기

Go에서 CSV 파일을 효율적으로 읽고 쓰는 작업에는 I/O 작업 최적화가 포함됩니다. . CSV 파일을 읽고, 데이터에 대한 계산을 수행하고, 결과를 새 CSV 파일에 기록하는 다음 코드 조각을 고려해 보세요.

<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>

이 코드의 주요 개선 사항은 동시성을 사용하여 CSV를 처리한다는 것입니다. 한 번에 하나씩 행. 채널을 사용하면 goroutine의 입력 CSV 파일에서 행을 읽고 동시에 기본 루틴의 출력 CSV 파일에 결과를 쓸 수 있습니다. 이 접근 방식을 사용하면 전체 파일을 메모리에 로드하지 않으므로 메모리 소비가 크게 줄어들고 성능이 향상될 수 있습니다.

위 내용은 동시성을 사용하여 Go에서 어떻게 효율적으로 CSV 파일을 읽고 쓸 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.