hw-dsv-0.3.8: weigh/Space.hs
module Main where
import Data.ByteString (ByteString)
import Data.Vector (Vector)
import HaskellWorks.Data.Dsv.Internal.Char (comma)
import Weigh
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Csv as CSV
import qualified Data.Csv.Streaming as CSS
import qualified Data.Foldable as F
import qualified Data.Vector as DV
import qualified HaskellWorks.Data.Dsv.Lazy.Cursor as SVL
import qualified HaskellWorks.Data.Dsv.Lazy.Cursor.Lazy as SVLL
import qualified HaskellWorks.Data.Dsv.Strict.Cursor as SVS
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
repeatedly :: (a -> Maybe a) -> a -> [a]
repeatedly f a = a:case f a of
Just b -> repeatedly f b
Nothing -> []
loadCsvStrict :: FilePath -> IO (DV.Vector (DV.Vector ByteString))
loadCsvStrict filePath = do
c <- SVS.mmapCursor comma False filePath
return $ SVS.toVectorVector c
loadCsvLazy :: FilePath -> IO [DV.Vector LBS.ByteString]
loadCsvLazy filePath = do
bs <- LBS.readFile filePath
let c = SVL.makeCursor comma bs
return $ SVLL.toListVector c
main :: IO ()
main = do
let infp = "data/bench/data-0001000.csv"
mainWith $ do
setColumns [Case, Allocated, Max, Live, GCs]
sequence_
[ action "cassava strict" $ do
r <- fmap (CSV.decode CSV.HasHeader) (LBS.readFile infp) :: IO (Either String (Vector (Vector ByteString)))
case r of
Left _ -> error "Unexpected parse error"
Right v -> pure v
, action "cassava streaming" $ do
fmap (F.toList . CSS.decode CSS.HasHeader) (LBS.readFile infp) :: IO [Vector ByteString]
, action "hw-dsv strict" $ do
v <- loadCsvStrict infp :: IO (Vector (Vector ByteString))
pure v
, action "hw-dsv lazy" $ do
v <- loadCsvLazy infp :: IO [Vector LBS.ByteString]
pure v
]
return ()