В настоящее время я пытаюсь прочитать содержимое файла XML в Map Int (Map Int String)
, и он работает довольно хорошо (с использованием HaXml). Однако меня не устраивает потребление памяти моей программой, и проблемы, похоже, связаны с сборкой мусора.
Вот код, который я использую для чтения файла XML:
type TextFile = Map Int (Map Int String)
buildTextFile :: String -> IO TextFile
buildTextFile filename = do content <- readFile filename
let doc = xmlParse filename content
con = docContent (posInNewCxt filename Nothing) doc
return $ buildTF con
Мое предположение заключается в том, что content
сохраняется в памяти даже после возврата, хотя это не обязательно (конечно, это также может быть doc
или con
). Я пришел к такому выводу, потому что потребление памяти быстро увеличивается с очень большими XML-файлами, хотя результирующее TextFile
является только одноэлементной картой одноэлементной карты (с использованием специального файла тестирования, как правило, это другое, конечно). Итак, в итоге у меня есть Map
из Map Int String
, в котором есть только одна строка, но потребление памяти составляет до 19 МБ.
Использование строгого приложения ($!
) или использование Data.Text
вместо String
в TextFile
ничего не меняет.
Итак, мой вопрос: есть ли какой-нибудь способ сообщить компилятору, что строка content
(или doc
или con
) больше не нужна и что она может быть сборщиком мусора?
И в целом: как я могу выяснить, откуда на самом деле возникает проблема, не догадываясь?
Редактировать: Как предложил FUZxxl, я попытался использовать deepseq и изменил вторую строку buildTextFile
примерно так:
let doc = content `deepseq` xmlParse filename content
К сожалению, это ничего не изменило (или я использовал это неправильно?) ...