2017-09-14 10 views
0

数値のみを含む(小数点付き)csv形式のファイルを読み込んで行列に格納し、操作を実行したいと考えています。それは、数千行以上3列を有することができる...goで数字のcsvデータをインポートする正しい方法

1.5、2.3、4.4
1.1、5.3、2.4

を:ファイルは次のようになります。

私はgo csvライブラリを使用してこれを解決しました。これは[] []文字列を作成した後、forループを使って[] [] float64に解析します。

func readCSV(filepath string) [][]float64 { 

    csvfile, err := os.Open(filepath) 
    if err != nil { 
     return nil 
    } 

    reader := csv.NewReader(csvfile) 
    stringMatrix, err := reader.ReadAll() 

    csvfile.Close() 

    matrix := make([][]float64, len(stringMatrix)) 

    //Parse string matrix into float64 
    for i := range stringMatrix { 
     matrix[i] = make([]float64, len(stringMatrix[0])) 
     for y := range stringMatrix[i] { 
      matrix[i][y], err = strconv.ParseFloat(stringMatrix[i][y], 64) 
     } 
    } 

    return matrix 
} 

これが正しいか効率的な方法か、より良い方法があるかどうかは疑問でした。

代わりにreader.Read()を使用して、読み込み中に各行を解析するようにします。私は知らないけど、私はたくさんの重複した仕事をしているように感じる。

答えて

5

すべてのデータの使い方によって異なります。メモリ内のCSVコンテンツ全体(stringMatrix)を読み取った後、float64(matrix)に変換されたデータを保持する別の変数を作成するため、コードはメモリの点で効率的ではありません。したがって、CSVファイルのサイズが1 GBの場合、stringMatrixでは1 GBのRAMを使用し、matrixでは1 GBのRAMを使用します。

あなたがいずれかの方法でコードを最適化することができます。

  • 線でreaderラインを読んで、matrixにデータを追加します。一度にメモリ内にstringMatrixの全体を入れる必要はありません。
  • readerを1行ずつ読み、1行ずつ処理します。たぶんあなたはmatrixをメモリに持っている必要はないかもしれません。おそらく、あなたがそれを読むときにデータを処理し、一度にすべてをメモリに格納することはできません。それはプログラムの残りの部分、CSVデータの使用方法に依存します。

上記の2番目の方法を使用している場合、その機能からCSVデータ全体を返す必要がない場合、プログラムはGBの代わりに数バイトのRAMを使用できます。

関連する問題