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 중국어 웹사이트의 기타 관련 기사를 참조하세요!