小编Ant*_*ton的帖子

使用Cassava在内存中加载CSV

我试图将CSV加载到内存中作为矢量与木薯的矢量.我的程序确实有效,但是对于50MB的csv文件使用了大量的内存,我不明白为什么.

我知道使用Data.Csv.Streaming应该对大文件更好,但我认为50MB仍然可以.我想这两个Data.Csv和Data.Csv.Streaming从GitHub的项目页面或多或少典型的例子,我也试图实现自己的解析器,输出矢量的矢量(我以我的attoparsec-CSV代码https://开头hackage.haskell.org/package/attoparsec-csv),所有这些解决方案都使用大约2000MB的内存!我确信我所做的事情有问题.这样做的正确方法是什么?

我的最终目标是将数据完全加载到内存中,以便以后进一步处理.例如,我可以将数据拆分为有趣的矩阵,并与使用Hmatrix的人一起工作.

以下是我尝试使用Cassava的2个程序:

1 /使用Data.Csv

import qualified Data.ByteString.Lazy as BL
import qualified Data.Vector as V
import Data.Csv
import Data.Foldable


main = do
   csv <- BL.readFile "train.csv"
   let Right res = decode HasHeader csv :: Either String (V.Vector(V.Vector(BL.ByteString)))
   print $ res V.! 0
Run Code Online (Sandbox Code Playgroud)

2 /使用Data.Csv.Streaming

{-# LANGUAGE BangPatterns #-}

import qualified Data.ByteString.Lazy as BL
import qualified Data.Vector as V
import Data.Csv.Streaming
import Data.Foldable


main = do
   csv <- BL.readFile "train.csv"
   let !a = decode HasHeader csv :: Records(V.Vector(BL.ByteString)) …
Run Code Online (Sandbox Code Playgroud)

memory csv haskell

6
推荐指数
1
解决办法
748
查看次数

标签 统计

csv ×1

haskell ×1

memory ×1