2009-06-26 54 views
9

我想寫一些應用程序,執行數據分析,存儲在相當大的XML文件(從10到800MB)。每組數據都存儲爲單個標籤,具體數據被指定爲attrobutes。我現在從HaXml中獲得了saxParse,並且在使用它的時候對內存使用情況不滿意。在解析15Mb XML文件時,它會消耗超過1Gb的內存,儘管我試圖不將數據存儲在列表中,並立即進行處理。我用下面的代碼:Haskell的哪個XML解析器?

importOneFile file proc ioproc = do 
    xml <- readFile file 
    let (sxs, res) = saxParse file $ stripUnicodeBOM xml 
    case res of 
     Just str -> putStrLn $ "Error: " ++ str; 
     Nothing -> forM_ sxs (ioproc . proc . (extractAttrs "row")) 

其中「PROC」 - 程序,它執行從屬性數據轉換成記錄和「ioproc」 - 程序,執行一些IO動作 - 輸出到屏幕,存儲在數據庫中,等等。

如何在XML解析期間減少內存消耗?切換到另一個XML解析器有幫助嗎?

更新:哪個解析器支持不同的輸入編碼 - utf-8,utf-16,utf-32等?

回答

4

如果您願意認爲您的輸入有效,請考慮查看來自Galois夥伴的TagSoupText.XML.Light

這些採取字符串作爲輸入,這樣你就可以(間接)餵它們什麼Data.Encoding理解,即

  • ASCII
  • UTF8
  • UTF16
  • UTF32
  • KOI8R
  • KOI8U
  • ISO88591
  • GB18030
  • BootString
  • ISO88592
  • ISO88593
  • ISO88594
  • ISO88595
  • ISO88596
  • ISO88597
  • ISO88598
  • ISO88599
  • ISO885910
  • ISO885911
  • ISO885913
  • ISO885914
  • ISO885915
  • ISO885916
  • CP1250
  • CP1251
  • CP1252
  • CP1253
  • CP1254
  • CP1255
  • CP1256
  • CP1257
  • CP1258
  • MacOSRoman
  • JISX0201
  • JISX0208
  • ISO2022JP
  • JISX0212
3

我不是Haskell的專家,但是你碰到的聲音聽起來像一個經典的空間泄漏(即Haskell的懶惰評估導致它保留超過必要的內存的情況)。你可以通過強制你的saxParse輸出來解決它。

還有在Real World Haskell.

編輯的分析和優化良好的章節:上找到分析/發現另一個很好的資源瓶頸here