2009-06-26 21 views
9

Oldukça büyük XML dosyalarında (10'dan 800MB'a kadar) saklanan verilerin analizini gerçekleştiren bir uygulama yazmaya çalışıyorum. Her bir veri seti, attrobutes olarak belirtilen somut verilerle tek etiket olarak saklanır. Şu anda HaXml'den saxParse kullanıyorum ve onunla çalışırken bellek kullanımından memnun değilim. Listelerde veri saklamamaya ve hemen işlemeye çalışmamıza rağmen, 15Mb XML dosyasının ayrıştırılmasıyla 1Gb'den fazla bellek tüketiyor. Kod aşağıdaki kullanmaktadır:Haskell için hangi XML ayrıştırıcı?

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")) 

burada 'proc - kayda özelliklere veri dönüşüm gerçekleştirir prosedürü, ve 'ioproc' - bazı ES eylemi gerçekleştirir prosedürü, - veri tabanında depolanması, ekran çıktısı, vb.

XML ayrıştırma işlemi sırasında bellek tüketimini nasıl azaltabilirim? Başka bir XML ayrıştırıcı yardımına geçmeli mi?

Güncelleme: ve hangi ayrıştırıcı farklı giriş kodlamaları için destekliyor - utf-8, utf-16, utf-32, vs.?

cevap

4

Girişlerinizin geçerli olduğunu kabul etmek istiyorsanız, Galois milletlerinden TagSoup veya Text.XML.Light'a bakmayı düşünün.Eğer (dolaylı olarak) onlara yani anlayan Data.Encoding şey,

  • ASCII
  • UTF8
  • UTF16
  • UTF32
  • KOI8R
  • KOI8U besleyebilir böylece

    Bunlar, girdi olarak dizeleri almak

  • ISO88591
  • GB18030'u
  • 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 uzmanı değilim, ama klasik uzay sızıntısı gibi seslere girdiğiniz şey (yani, Haskell'in tembel değerlendirmesinin gerekenden daha fazla bellek ayırmasına neden olduğu bir durum). SaxParse çıktınızdaki katılığı zorlayarak bunu çözebilirsiniz.

Real World Haskell.

EDIT profilleme ve optimizasyon üzerinde iyi bir bölüm de var: profilleme/bulgusuna başka iyi bir kaynak here darboğazları buldum.