」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用並發在 Go 中高效率地讀寫 CSV 檔案?

如何使用並發在 Go 中高效率地讀寫 CSV 檔案?

發佈於2024-11-09
瀏覽:321

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

Go 中高效的 CSV 讀寫

Go 中高效的 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()
}

package main 進口 ( “編碼/csv” “FMMT” "紀錄" "作業系統" “strcon” ) func ReadRow(r *csv.Reader) (map[string]string, error) { 記錄, err := r.Read() 如果錯誤 == io.EOF { 返回零,io.EOF } 如果錯誤! = nil { 回傳零,錯誤 } m := make(地圖[字串]字串) 對於 i, v := 範圍記錄 { m[strconv.Itoa(i)] = v } 返回 m,零 } 函數主() { // 載入資料csv csvFile, err := os.Open("./path/to/datafile.csv") 如果錯誤! = nil { 日誌.致命(錯誤) } 延後 csvFile.Close() // 建立頻道來同時處理行 recCh := make(chan 映射[字串]字串, 10) 去函數(){ 延後關閉(recCh) r := csv.NewReader(csvFile) 如果 _, err := r.Read(); err != nil { //讀取標題 日誌.致命(錯誤) } 為了 { 記錄,錯誤:= ReadRow(r) 如果錯誤 == io.EOF { return // 不再需要讀取行 } 如果錯誤! = nil { 日誌.致命(錯誤) } 記錄How can I efficiently read and write CSV files in Go using concurrency? 
此程式碼的主要改進是使用並發性一次處理一個 CSV 行。透過使用通道,我們可以在 Goroutine 中從輸入 CSV 檔案中讀取行,並將結果同時寫入主例程中的輸出 CSV 檔案中。這種方法避免了將整個檔案載入到記憶體中,可以顯著減少記憶體消耗並提高效能。
最新教學 更多>
  • 組合與繼承
    組合與繼承
    介绍 继承和组合是面向对象编程(OOP)中的两个基本概念,但它们的用法不同并且具有不同的目的。这篇文章的目的是回顾这些目的,以及选择它们时要记住的一些事情。 继承的概念 当我们考虑在设计中应用继承时,我们必须了解: 定义:在继承中,一个类(称为派生类或子类)可以从另...
    程式設計 發佈於2024-11-09
  • 如何在 JavaScript 中將浮點數轉換為整數?
    如何在 JavaScript 中將浮點數轉換為整數?
    如何在 JavaScript 中將浮點數轉換為整數要將浮點數轉換為整數,您可以使用 JavaScript內建數學物件。 Math 物件提供了多種處理數學運算的方法,包括舍入和截斷。 方法:1。截斷:截斷去除數字的小數部分。要截斷浮點數,請使用 Math.floor()。此方法向下舍入到小於或等於原始...
    程式設計 發佈於2024-11-09
  • 標準字串實作中的 c_str() 和 data() 是否有顯著差異?
    標準字串實作中的 c_str() 和 data() 是否有顯著差異?
    標準字串實作中的c_str()與data()STL中c_str()和data()函數的區別人們普遍認為類似的實作是基於空終止的。據推測,c_str() 總是提供以 null 結尾的字串,而 data() 則不然。 然而,在實踐中,實作經常透過讓 data() 在內部呼叫 c_str() 來消除這種區...
    程式設計 發佈於2024-11-09
  • C/C++ 中的類型轉換如何運作以及程式設計師應該注意哪些陷阱?
    C/C++ 中的類型轉換如何運作以及程式設計師應該注意哪些陷阱?
    了解C/C 中的類型轉換型別轉換是C 和C 程式設計的一個重要方面,涉及將資料從一種類型轉換為另一種類型。它在記憶體管理、資料操作和不同類型之間的互通性方面發揮著重要作用。然而,了解類型轉換的工作原理及其限制對於防止潛在錯誤至關重要。 明確型別轉換使用 (type) 語法執行的明確型別轉換可讓程式設...
    程式設計 發佈於2024-11-09
  • 我們如何在 Golang 中為不同的資料類型建立通用函數?
    我們如何在 Golang 中為不同的資料類型建立通用函數?
    Golang 中的通用方法參數在 Go 中,一個常見的需求是有一個對不同類型的資料進行操作的函數。以計算特定類型切片中元素數量的函數為例。如何設計這個函數來處理任何類型的數據,而不僅僅是它最初設計的特定類型? 一種方法是使用接口,它本質上是定義類型必須的一組方法的契約實現以符合接口。透過使用介面作為...
    程式設計 發佈於2024-11-09
  • 使用 Node.js 流進行高效能資料處理
    使用 Node.js 流進行高效能資料處理
    在本文中,我们将深入研究 Node.js Streams 并了解它们如何帮助高效处理大量数据。流提供了一种处理大型数据集的优雅方式,例如读取大型文件、通过网络传输数据或处理实时信息。与一次性读取或写入整个数据的传统 I/O 操作不同,流将数据分解为可管理的块并逐块处理它们,从而实现高效的内存使用。 ...
    程式設計 發佈於2024-11-09
  • 如何在 Python 中產生字串的所有可能排列,包括處理重複項?
    如何在 Python 中產生字串的所有可能排列,包括處理重複項?
    Python 中的字串排列查找給定字串的所有可能排列可能是一項具有挑戰性的任務。然而,Python使用itertools模組提供了一個簡單的解決方案。 解決方案:itertools.permutations()itertools.permutations()方法是專門為生成排列而設計的。它接受一個可...
    程式設計 發佈於2024-11-09
  • 如何不使用CMD直接從C++呼叫Java函數?
    如何不使用CMD直接從C++呼叫Java函數?
    從C 應用程式呼叫Java 函數從C 應用程式呼叫Java 函數是一項挑戰,特別是在尋求繞過使用的直接解決方案時要在這兩種語言之間建立通信,請考慮「從C 建立JVM」中詳細介紹的方法。它概述了創建 JVM 並隨後呼叫 Java 方法的過程。 在 JVM 已經存在的情況下(例如,當 Java 程式呼叫...
    程式設計 發佈於2024-11-09
  • 為什麼我無法更改 IE8 中禁用的 HTML 控制項的文字顏色?
    為什麼我無法更改 IE8 中禁用的 HTML 控制項的文字顏色?
    IE8 中禁用的HTML 控制項的CSS 顏色變更問題在HTML 中,disabled 屬性停用輸入控制項,但它也會影響控制項這些控制項的外觀。大多數瀏覽器都支援使用 CSS 套用於停用控制項的自訂樣式。然而,Internet Explorer 8 (IE8) 在更改停用控制項的顏色方面提出了獨特的...
    程式設計 發佈於2024-11-09
  • DRUGHUB 的軟體需求規格 (SRS)
    DRUGHUB 的軟體需求規格 (SRS)
    1.介紹 1.1 目的 本文檔概述了 DRUGHUB 網站的軟體要求,該網站旨在促進沙烏地阿拉伯和埃及的藥品、醫療設備和必需品的採購、物流和供應鏈管理。該網站將透過簡化營運並確保無縫存取關鍵資源來為醫療保健組織提供服務。 1.2 範圍 DRUGHU...
    程式設計 發佈於2024-11-09
  • 如何從網路讀取多個值
    如何從網路讀取多個值
    在 Node.js 中,處理資料通常涉及從檔案讀取資料並將這些資料插入資料庫。以下是如何從檔案中讀取 JSON 資料、處理以及將其格式化以用於 SQL INSERT 語句: 使用fs.readFile方法讀取檔案內容 使用JSON.parse將JSON字串轉換為物件 使用 .map() 迭代 JSO...
    程式設計 發佈於2024-11-09
  • 哪個 Python 函式庫最適合進行模糊字串比較和相似度百分比計算?
    哪個 Python 函式庫最適合進行模糊字串比較和相似度百分比計算?
    Python 中模糊字串比較的方法尋求一個用於模糊字串比較的庫,特別是計算相似性百分比的庫,提出了一個問題其中哪些模組適合此任務。一個突出的選項是 difflib。 探索 Difflib 的模糊比較功能Difflib 是一個為比較序列而設計的模組,提供了多種針對模糊字串比較而定制的函數。其中值得注意...
    程式設計 發佈於2024-11-09
  • 如何修復 Windows 上的「pip install」存取被拒絕錯誤?
    如何修復 Windows 上的「pip install」存取被拒絕錯誤?
    克服Windows 上的「pip install」存取被拒絕錯誤使用pip 安裝可能是一項簡單的任務,但有時您可能會遇到存取錯誤在Windows 上出現拒絕錯誤,即使以管理員身分執行命令提示字元或PowerShell 也是如此。 此錯誤通常表現為如:WindowsError: [Error 5] A...
    程式設計 發佈於2024-11-09
  • 如何使用 ESLint 規則讓 JavaScript 錯誤處理更具可讀性
    如何使用 ESLint 規則讓 JavaScript 錯誤處理更具可讀性
    简介:掌握 JavaScript 中的错误处理 有效的错误处理对于任何健壮的 JavaScript 应用程序都至关重要。它有助于快速识别问题、简化调试并增强软件可靠性。本指南深入探讨通过 ESLint 改进 JavaScript 错误处理,ESLint 是一种增强代码质量并标准化错...
    程式設計 發佈於2024-11-09
  • Go 中的機率提前過期
    Go 中的機率提前過期
    关于缓存踩踏 我经常遇到需要缓存这个或那个的情况。通常,这些值会被缓存一段时间。您可能熟悉这种模式。您尝试从缓存中获取一个值,如果成功,则将其返回给调用者并结束。如果该值不存在,您将获取它(很可能从数据库中)或计算它并将其放入缓存中。在大多数情况下,这非常有效。但是,如果您用于缓存...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3