時TemplateHaskell內存使用情況我在RuzzSolver,我的Haskell的一個項目使用TemplateHaskell時有內存消耗問題。 Sources of RuzzSolver are available on GitHub。編譯
爲了實現良好的性能,我加載〜380000字字典成Tree
結構(從容器包裝)。這極大地加速了網格的求解,但是加載本身需要一些時間(取決於CPU,在1到2秒之間)。
我想在編譯時通過TemplateHaskell直接創建結構。
所以我改變了字典加載:
-- Dictionary.hs, line 155
getDictionary :: String -> IO Dictionary
getDictionary dictionaryFilePath = do
content <- readFile dictionaryFilePath
return $ foldl (+++) [] (createTree <$> lines content)
這個功能:
-- Dictionary.hs, line 164
getDictionaryQ :: String -> Q Exp
getDictionaryQ dictionaryFilePath = do
content <- runIO $ readFile dictionaryFilePath
lift $ foldl (+++) [] (createTree <$> lines content)
它讓我從去:
-- ruzzSolver.hs, line 68
dictionary <- getDictionary "dictionary/ruzzdictionary.txt"
到:
-- ruzzSolver.hs, line 68
let dictionary = $(getDictionaryQ "dictionary/ruzzdictionary.txt")
它(應該)的作品,但它需要太多的內存編譯!在我的8 GB PC上,當耗電量達到12 GB時,我不得不停止GHC。將字典縮小到38000字可以編譯,但仍需要3至4 GB。
編譯此TemplateHaskell代碼時,有沒有辦法讓GHC使用更少的內存?或者將此結構嵌入到可執行文件中的另一種方法?
這與您的問題沒有直接關係,但聽起來像您使用樹作爲某種排序方式。有些庫提供嘗試,包括[bytestring-trie](https://hackage.haskell.org/package/bytestring-trie)和[word-trie](https://hackage.haskell.org/package /字線索)。 – dfeuer
@dfeuer你是對的,這是一個特里:-) – zigazou
似乎加載一對夫婦文件應該不是什麼大不了的事。仔細查看你的加載代碼。您是否使用(懶惰)[bytestrings](https://hackage.haskell.org/package/bytestring-0.10.6.0/docs/Data-ByteString-Lazy.html)加載文件?我希望文件已經排序?你能想出一個文件表示法,它將樹存儲在一個只需很少的計算來加載的狀態;例如使用[Data.Binary](https://hackage.haskell.org/package/binary-0.7.6.1/docs/Data-Binary.html)?瘋狂的想法:基於[mmap](https://hackage.haskell.org/package/mmap)實現一個trie。 – luqui