import qualified Data.HashMap.Strict as M
import qualified Data.Text as T
import qualified Data.Text.IO as T.IO
import Text.FShow.RealFloat (fshow)
main = do
dataA <- T.IO.readFile "pathA"
dataB <- T.IO.readFile "pathB"
...
let hashmap = -- process dataA and dataB
hashmapList = map (\(t1,t1Map) -> (t1, map (\(t2,float) -> (t2,fshow float)) (M.toList t1Map))) $ M.toList hashmap
hashmapString = show hashmapList
writeFile "path" hashmapString
我想将hashmap(请参阅上面的代码)(类型为M.HashMap T.Text (M.HashMap T.Text Float)
)写入文件。我将hashmap转换为List,并使用fshow有效地显示Floats。使用show
我然后将List转换为String并将其写入文件。
使用-O2进行编译并分析产量:
COST CENTRE MODULE %time %alloc
main.hashmapList.\.\ Main 46.0 50.0
main.hashmapString Main 32.5 41.1
main.writeFile Main 11.9 0.2
main.hashmapList.\ Main 3.4 2.7
...
因此,特别是将Map转换为List并将List转换为String需要大量的时间和空间。如何更有效地将hashmap写入文件?
答案 0 :(得分:1)
不妨正确回答这个问题。如果您打开了文件句柄并将IO操作写入此文件,那么您可以使用mapM_
中的Data.Foldable
并在整个结构上运行该操作以将其运行到该文件中。如果您还需要密钥,那么traverseWithKey
之类的东西就是您的朋友。