2009-06-26 13 views
9

मैं कुछ एप्लिकेशन लिखने की कोशिश कर रहा हूं, जो डेटा की विश्लेषण करता है, जो बहुत बड़ी एक्सएमएल फाइलों में संग्रहीत होता है (10 से 800 एमबी तक)। डेटा के प्रत्येक सेट को एकल टैग के रूप में संग्रहीत किया जाता है, जिसमें ठोस डेटा को एट्रोब्यूट्स के रूप में निर्दिष्ट किया जाता है। मैं वर्तमान में HaXml से saxParse हूं, और मैं इसके साथ काम के दौरान स्मृति उपयोग से संतुष्ट नहीं हूं। 15 एमबी एक्सएमएल फ़ाइल के पार्सिंग पर यह 1 जीबी से अधिक मेमोरी का उपभोग करता है, हालांकि मैंने सूचियों में डेटा स्टोर नहीं करने की कोशिश की और इसे तुरंत संसाधित किया। मैं कोड निम्न का उपयोग करें:हास्केल के लिए कौन सा एक्सएमएल पार्सर?

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' - प्रक्रिया, कुछ आईओ कार्रवाई कि निष्पादित करता है - स्क्रीन पर उत्पादन, डेटाबेस में संग्रहीत करने, आदि

एक्सएमएल पार्सिंग के दौरान मैं मेमोरी खपत कैसे कम कर सकता हूं? किसी अन्य एक्सएमएल पार्सर में स्विच करना चाहिए?

अद्यतन: और कौन सा पार्सर विभिन्न इनपुट एन्कोडिंग के लिए समर्थन करता है - utf-8, utf-16, utf-32, आदि?

उत्तर

4

यदि आप यह मानना ​​चाहते हैं कि आपके इनपुट मान्य हैं, तो गैलोइस लोगों से TagSoup या Text.XML.Light पर विचार करें।

ये, इनपुट के रूप में तार ले ताकि आप कर सकते हैं (परोक्ष रूप से) उन्हें कुछ भी Data.Encoding समझता है, अर्थात्

  • ASCII
  • UTF8
  • UTF16
  • UTF32
  • KOI8R
  • KOI8U फ़ीड
  • आईएसओ 88591
  • 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

मैं कोई हास्केल विशेषज्ञ नहीं हूं, लेकिन क्लासिक स्पेस-रिसाव की तरह लगता है कि आप क्या चल रहे हैं (यानी, एक ऐसी स्थिति जिसमें हैस्केल के आलसी मूल्यांकन से यह आवश्यकतानुसार अधिक स्मृति को आरक्षित कर रहा है)। आप अपने saxParse आउटपुट पर सख्तता को मजबूर कर इसे हल कर सकते हैं।

वहाँ भी में Real World Haskell.

संपादित रूपरेखा और अनुकूलन पर एक अच्छा अध्याय है: मिले रूपरेखा/खोज पर एक और अच्छा संसाधन बाधाओं here

संबंधित मुद्दे