2008-10-23 17 views
5

मैं बहुत बड़ी एक्सएमएल फाइल के खिलाफ XSLTs निष्पादित करने के लिए एक उपकरण की जरूरत है। स्पष्ट होने के लिए, मुझे XSLT को डिज़ाइन, संपादित या डिबग करने के लिए कुछ भी नहीं चाहिए, बस उन्हें निष्पादित करें। मेरे द्वारा उपयोग किए जा रहे परिवर्तन पहले ही अच्छी तरह अनुकूलित हैं, लेकिन बड़ी फाइलें मेमोरी से बाहर निकलने के लिए टूल (सैक्सन v9.1) का प्रयास कर रही हैं।मेमोरी कुशल XSLT प्रोसेसर

+0

कृपया प्रश्न का शीर्षक इस तरह बदलें: "लो-मेमोरी एक्सएसएलटी प्रोसेसर"। आप "सर्वश्रेष्ठ चारों ओर" में रुचि नहीं रखते हैं, लेकिन विशेष रूप से "रैम से बड़ी फ़ाइलों में से सर्वश्रेष्ठ" में। – ddaa

+0

शायद "रैम से बड़ी फ़ाइलों के लिए एक्सएसएलटी प्रक्रिया"। – ddaa

+0

@ सैंटोशके, ऐसा लगता है कि आप इस प्रश्न के लिंक में गलती से चिपके हुए हैं। यही है, आप प्रश्न # 230702 से जुड़े हैं, और यह प्रश्न # 230702 है। –

उत्तर

5

मैं एक अच्छा समाधान मिल गया। यह pluggable memory manager प्रदान करता है, जिससे मुझे इनपुट और ट्रांसफॉर्म के आधार पर आवंटन ट्यून करने की अनुमति मिलती है।

कई मामलों में यह खपत है ~ 60% कम स्मृति (मैं निजी बाइट्स पर देख रहा हूँ) दूसरों मैं कोशिश की है की तुलना में में

+0

अभी भी "रैम से बड़ी फ़ाइलों को संसाधित करने" के लिए अच्छा नहीं है, लेकिन यदि यह आपके लिए पर्याप्त है, तो बढ़िया। – ddaa

-2
+0

मुमकिन नीचे मतदान क्योंकि लिंक (और उपकरण) अब वैध/उपलब्ध है जाएगा। –

1

पर एक नजर डालें मैं ने पाया है कि एक कस्टम उपकरण XSLT MSXML यह बनाता है के पिछले संस्करणों का उपयोग कर चलाने के लिए बनाया बहुत तेजी से, लेकिन यह भी स्मृति के अविश्वसनीय मात्रा में सेवन करता है, और होगा वास्तव में पूरा नहीं हुआ अगर यह बहुत बड़ा है। आप कुछ उन्नत एक्सएसएलटी कार्यक्षमता पर भी हार जाते हैं क्योंकि एमएसएक्सएमएल के पुराने संस्करण पूर्ण एक्सपैथ सामान का समर्थन नहीं करते हैं।

यदि आपके अन्य विकल्प बहुत अधिक समय लेते हैं तो यह प्रयास करने योग्य है।

+0

थोड़ी देर के लिए गंदा रहस्य यह तथ्य था कि एमएसएक्सएमएल 4.0 के शुरुआती नेट समकक्ष वास्तविक धीमे थे !!! –

1

यह एक दिलचस्प सवाल है। एक्सएसएलटी को अंतरिक्ष के लिए संभावित रूप से अनुकूलित किया जा सकता है, लेकिन मैं स्रोत दस्तावेज को डीओएम में पार्स करके शुरू करने के लिए सबसे अस्पष्ट कार्यान्वयन के अलावा सभी की अपेक्षा करता हूं, जो स्मृति में दस्तावेज़ आकार के निम्न एकाधिक का उपयोग करने के लिए बाध्य है।

जब तक स्टाइलशीट विशेष रूप से एक भी पास परिवर्तन का समर्थन करने के लिए बनाया गया है, उचित समय प्रदर्शन शायद एक डिस्क-आधारित श्रेणीबद्ध डेटाबेस में स्रोत दस्तावेज़ पार्स करने की आवश्यकता होगी।

मेरे पास कोई जवाब नहीं है, हालांकि। अपाचे के Xalan C++:

+0

हां, यह अंतर्निहित समस्या का वर्णन करता है। –

2

ऐसा लगता है जैसे आप सॉर्ट किए गए हैं - लेकिन अक्सर, एक और संभावित तरीका डेटा को पहले विभाजित करना है। जाहिर है यह केवल कुछ परिवर्तनों के साथ काम करता है (यानी जहां डेटा के अलग-अलग हिस्सों को पूरी तरह से अलगाव में इलाज किया जा सकता है) - लेकिन फिर आप प्रबंधित टुकड़ों में विभाजित करने के लिए एक साधारण पार्सर (डीओएम के बजाए) का उपयोग कर सकते हैं, फिर प्रत्येक खंड को संसाधित करें अलग से और फिर से इकट्ठा।

जब से मैं एक .NET बीओडी हूँ, XmlReader तरह बातें एक डोम के बिना बेडौल कर सकते हैं; मुझे यकीन है कि हर भाषा के लिए समकक्ष हैं।

फिर से - पूर्णता के लिए।

[संपादित करें फिर से सवाल] मैं किसी भी विशिष्ट नाम के बारे में पता नहीं कर रहा हूँ; शायद Divide and Conquer। उदाहरण के लिए; यदि आपका डेटा वास्तव में वस्तुओं की एक विस्तृत सूची है, तो आप केवल 2-पंक्तियों के बजाय पहले स्तर के बच्चों को विभाजित कर सकते हैं - यानी इसे 200 किलोग्राम पंक्तियों में विभाजित कर सकते हैं, या 100 किलोग्राम पंक्तियों में से 100 हो सकते हैं। मैंने थोक डेटा के साथ काम करने के लिए कई बार ऐसा किया है (उदाहरण के लिए, डेटा के सभी हिस्सों में अपलोड करना [सभी वैध] और सर्वर पर फिर से संयोजन करना ताकि प्रत्येक व्यक्ति अपलोड मजबूत होने के लिए पर्याप्त छोटा हो)।

+0

धन्यवाद मार्क, यह एक अच्छा विचार है। क्या आप मुझे इसके बारे में और अधिक बता सकते हैं? क्या इस तकनीक के लिए कोई नाम है ताकि मैं इसका शोध कर सकूं? –

0

क्या आप सैक्सन या नेट पोर्ट के जावा संस्करण का उपयोग कर रहे हैं? यदि आप स्मृति से बाहर हैं (-Xms कमांड लाइन पैरामीटर का उपयोग कर रहे हैं) तो आप जावा वीएम को सैक्सन चलाने के लिए अधिक मेमोरी असाइन कर सकते हैं।

मुझे यह भी पता चला है कि सैक्सन का नेट संस्करण जावा संस्करण से कम आसानी से स्मृति से बाहर चला जाता है।

3

स्ट्रीमिंग-आधारित XSLT- जैसे परिवर्तनों के लिए आप STX पर देखना चाह सकते हैं। वैकल्पिक रूप से, मेरा मानना ​​है कि ट्रांसफॉर्मर इंटरफ़ेस के माध्यम से StAXintegrate with XSLT nicely कर सकते हैं।

+0

इसे जोड़ने के लिए धन्यवाद - एसटीएक्स मेरे लिए बिल्कुल नया था। –

2

इसके लायक होने के लिए, मुझे संदेह है कि जावा के लिए, सैक्सन उतना ही अच्छा है जितना कि आपको एक्सएसएलटी का उपयोग करने की आवश्यकता है। बड़े दस्तावेजों के लिए यह काफी कुशल (सीपीयू और मेमोरी दोनों) है, लेकिन सीमित मामलों को छोड़कर, एक्सएसएलटी स्वयं अनिवार्य रूप से सामग्री के पूर्ण इन-मेमोरी पेड़ को बनाए रखने और बनाए रखने के लिए मजबूर करता है। सैक्सन-एसए (फीस संस्करण के लिए) माना जाता है कि इस तरह के "स्ट्रीमिंग" मामलों का लाभ लेने की अनुमति देने के लिए एक्सटेंशन हैं, ताकि जांच की जा सकें।

लेकिन सामग्री को विभाजित करने की सलाह है सबसे अच्छा एक: यदि आप स्वतंत्र रिकॉर्ड के साथ काम कर रहे हैं, बस इनपुट अन्य तकनीकों (! तरह, Stax का उपयोग :-))

0

नेट के लिए का उपयोग कर विभाजित आप Microsoft Knowledge Base पर समाधान सुझाव का उपयोग कर सकते हैं: http://support.microsoft.com/kb/307494

XPathDocument srcDoc = new XPathDocument(srcFile); 
XslCompiledTransform myXslTransform = new XslCompiledTransform(); 
myXslTransform.Load(xslFile); 
using (XmlWriter destDoc = XmlWriter.Create(destFile)) 
{ 
    myXslTransform.Transform(srcDoc, destDoc); 
} 
1

ऐसा लगता है कि सैक्सन 9.2 आपकी समस्या का एक जवाब उपलब्ध करा सकता है। यदि आपके दस्तावेज़ को भविष्यवाणियों का उपयोग किए बिना बदला जा सकता है (वर्तमान नोड के किसी भी भाई बहन का संदर्भ नहीं देता है) तो आप स्ट्रीमिंग एक्सएसएलटी का उपयोग करने में सक्षम हो सकते हैं। this link

मैंने इसे स्वयं नहीं किया है, मैं बस इसके बारे में पढ़ रहा हूं। लेकिन मुझे उम्मीद है कि यह काम करता है।