Go에서 효율적인 CSV 읽기 및 쓰기
Go에서 CSV 파일을 효율적으로 읽고 쓰는 작업에는 I/O 작업 최적화가 포함됩니다. . CSV 파일을 읽고, 데이터에 대한 계산을 수행하고, 결과를 새 CSV 파일에 기록하는 다음 코드 조각을 고려해 보세요.
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()
}
이 코드의 주요 개선 사항은 동시성을 사용하여 CSV 행을 한 번에 하나씩 처리한다는 것입니다. 채널을 사용하면 goroutine의 입력 CSV 파일에서 행을 읽고 동시에 기본 루틴의 출력 CSV 파일에 결과를 쓸 수 있습니다. 이 접근 방식은 전체 파일을 메모리에 로드하는 것을 방지하여 메모리 소비를 크게 줄이고 성능을 향상시킬 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3