如何有效地将HashMap写入文件?

时间:2012-10-29 21:09:55

标签: haskell

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写入文件?

1 个答案:

答案 0 :(得分:1)

不妨正确回答这个问题。如果您打开了文件句柄并将IO操作写入此文件,那么您可以使用mapM_中的Data.Foldable并在整个结构上运行该操作以将其运行到该文件中。如果您还需要密钥,那么traverseWithKey之类的东西就是您的朋友。