2012-01-03 10 views
11

मुझे अपने सिद्धांतों को एक्सएमएल फ़ाइल (potentionaly बहुत बड़ी) एक्सएमएल फ़ाइल के अंदर रिकॉर्ड करने के लिए अद्यतन करना है। मुझे एक्सएमएल में डेटा के अनुसार कई सारे संगठनों को भी अपडेट करना होगा।सिद्धांत 2 - फ्लश दक्षता में सुधार कैसे करें?

  1. एक्सएमएल से डेटा प्राप्त
  2. डीबी से प्राप्त इकाई (यदि मौजूद नहीं है नया बनाएं)
  3. सेट नई इकाई गुण
  4. मिल चालू इकाई संघों (: यह है कि मैं क्या एक पाश के अंदर करना है गेटर रिटर्न ArrayCollection वस्तु)
  5. स्पष्ट सभी संघों (ArrayCollection::clear())
  6. नई संघों (सेट पर कॉल करके उप पाश में ArrayCollection::add() बुला)
  7. द्वारा
  8. EntityManager

द्वारा इकाई जारी रहती है पाश मैं EntityManager::flush() फोन करने के बाद।

समस्या यह है कि फ़्लशिंग एक बार में कई पंक्तियों को अद्यतन/डालने/हटाने/हटाने के बजाय बड़ी मात्रा में क्वेरी उत्पन्न करता है।

  • चुनें (यह वास्तव में अब छोड़ दिया है के रूप में कोई गुण बदल ... अभी तक)
  • पिछले स्पष्ट करने के लिए DELETE डीबी
  • से
  • इकाई गुण अद्यतन करने के लिए अद्यतन इकाई पाने के लिए: हर इकाई के लिए निम्नलिखित प्रश्नों क्रियान्वित कर रहे हैं संघों
  • नई संघों
एक्सएमएल में 305 रिकॉर्ड के लिए कुल में

तो मैं 915 प्रश्नों मिल (मुझे लगता है कि यदि सभी संस्थाओं बदल जाएगा यह 1220 प्रश्नों तक हो सकती है), जो वें बनाता है सम्मिलित करने के लिए सम्मिलित करें ई बहुत धीमी आयात करें।

मैं लूप से पहले पहचानमैप और प्री-फ़ेच इकाइयों का लाभ उठा सकता हूं, लेकिन अभी भी अपडेट/डिलीट/INSERT क्वेरी हैं।

  • वहाँ फ्लश विधि बेहतर अनुकूलन प्रश्नों (बहु डालने, कहां में एक से अधिक के बजाय प्रश्नों हटाएँ, आदि का उपयोग करें) जाने के लिए कोई तरीका है?
  • फ्लश विधि का यह सामान्य व्यवहार है या क्या मैं कुछ गलत कर रहा हूं?
  • शायद इस तरह की समस्या है कि मैं इकाई के संगठनों को कैसे अपडेट करता हूं। क्या ऐसा करने का बेहतर तरीका है? ("get/clear/add" विधि के बजाय)
  • मुझे पता है कि सिद्धांत सामूहिक बैच प्रोसेसिंग के लिए नहीं है, लेकिन मुझे लगता है कि एक्सएमएल आयात के लिए इसका उपयोग करना डीबी विसंगतियों से बचने का सबसे अच्छा तरीका है जो प्रदर्शित हो सकता है एक गैर-ओआरएम दृष्टिकोण। क्या वह सही है?
  • यदि ऊपर दिया गया दृष्टिकोण गलत है, तो मुझे समस्या को कैसे हल करना चाहिए?

उत्तर

30

आप इसे सही कर रहे हैं - यह सिर्फ धीमी है, क्योंकि ORM का जोड़ा अमूर्त मतलब है कि आप अनुकूलन आप चाहें तो की तरह नहीं कर सकते।

उस ने कहा, EntityManager बड़े लेनदेन पर धीमा हो जाता है।यदि आपको पूरी तरह से एक बड़े लेनदेन में उनकी ज़रूरत नहीं है, तो आप संभवतः फ्लश() आईएनजी द्वारा अधिक प्रदर्शन कोड प्राप्त कर सकते हैं और फिर अपने लूप के हर 20-200 पुनरावृत्तियों को ईएम में साफ़ कर सकते हैं।

यदि आपको पर्याप्त प्रदर्शन नहीं मिलता है, तो एकमात्र विकल्प जिसे मैं सोच सकता हूं वह कस्टम कोड पर वापस जाना है जो सीधे आपके डीबीएमएस के खिलाफ कस्टम एसक्यूएल चलाता है।

मुझे पता है कि यह एक अच्छा जवाब नहीं है, लेकिन कम से कम मैं आपको बता सकता हूं कि आप पागल नहीं हैं।

------ Batch processing पर संपादित ------

आधिकारिक Doctrine2 लेख से:

कुछ लोगों को क्यों सिद्धांत बहु आवेषण का उपयोग नहीं करता सोच हो रहे हैं ((...) मानें (...), (...), (...), ...

सबसे पहले, यह वाक्यविन्यास केवल mysql और नए postgresql संस्करणों पर समर्थित है दूसरा, सभीको पकड़ने का कोई आसान तरीका नहीं है ऑटोऑक्रिकमेंट या सीरियल और ओआरएम का उपयोग करते समय ऐसे बहु-सम्मिलन में जेनरेट किए गए पहचानकर्ता वस्तुओं की प्रबंधन प्रबंधन के लिए पहचानकर्ताओं की आवश्यकता होती है। अंत में, प्रदर्शन डालना शायद ही कभी ओआरएम की बाधा है। सामान्य प्रविष्टियां अधिकांश स्थितियों के लिए पर्याप्त तेज़ी से अधिक हैं और यदि आप वास्तव में तेज़ थोक आवेषण करना चाहते हैं, तो बहु-सम्मिलन वैसे भी सबसे अच्छा तरीका नहीं है, यानी पोस्टग्रेस सीओपीवाई या माइस्क्ल लोड डेटा इन्फ्लू तेजी से परिमाण के कई आदेश हैं ।

ये कारण हैं कि अमूर्तता को लागू करने के प्रयास के लायक नहीं हैं जो ORM में mysql और postgresql पर बहु-प्रविष्टियां करता है। जब दूरस्थ सर्वर से प्रत्येक प्रश्न भेजने काफी बड़ी है की भूमि के ऊपर के रूप में दूरदराज का उपयोग कर बनाम स्थानीय डेटाबेस

इसके अलावा प्रदर्शन में एक महत्वपूर्ण अंतर है। लेनदेन और डीबी अनुकूलन के लिए स्थानीय डेटाबेस धन्यवाद का उपयोग करते समय ओवरहेड बहुत कम है। (उदाहरण के लिए 70sec 300ms तक कम हो गया है) उदाहरण के मामले में

+5

+1 मुझे यह बताने के लिए कि मैं पागल नहीं हूं :) –

+3

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

+1

$ em-> स्पष्ट() जोड़ने के बाद, दृढ़ता इतनी तेज़ी से काम करती है, पूरी तरह से मेरी समस्या हल करती है। यदि आप भी तेज प्रविष्टि चाहते हैं, तो प्रत्येक सम्मिलित क्वेरी पर इंडेक्स पुनर्निर्माण अक्षम करें। $ conn-> तैयार करें ('SET autocommit = 0;') -> निष्पादित करें(), और प्रश्नों के बाद, $ conn-> तैयार करें ('COMMIT;') -> execute(); – tomazahlin

3

यह सुनिश्चित नहीं है कि यह मूल पोस्टर द्वारा उत्पन्न प्रश्न का सीधे उत्तर दे, लेकिन उम्मीद है कि यह फ़्लशिंग के दौरान सिद्धांत गति समस्याओं के साथ दूसरों की सहायता करेगा।

... फ्लश गति के संबंध में सुनिश्चित करें कि आपका xdebug प्रोफाइलर चालू नहीं है।

[php.ini] 
; PROFILING 
;xdebug.profiler_enable = 1 
;xdebug.profiler_output_name = "cachegrind.out.%t.%s.%p" 
;xdebug.profiler_output_dir = "C:\xampp\tmp" 

कितना यह मेरे मामले में एक सिद्धांत फ्लश आपरेशन प्रभावित का एक उदाहरण के रूप में, यह 3000 के रिकॉर्ड के लिए 55 सेकंड था जबकि साथ प्रोफाइलर बंद कर दिया यह 5 सेकंड था!

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