2012-03-26 9 views
7

मैं सोच रहा था कि अगर कोई वहां जानता था कि PHP में यह कैसे किया जा सकता है। मैं एक ऐसी स्क्रिप्ट चला रहा हूं जिसमें फ़ाइल खोलना, पहली 1000 लाइनें लेना, उन पंक्तियों के साथ कुछ सामान करना, फिर php फ़ाइल अगली हज़ार लाइनों को लेने के लिए स्वयं का एक और उदाहरण खोलती है और जब तक यह फ़ाइल के अंत तक नहीं पहुंच जाती । मैं splfileobject का उपयोग कर रहा हूं ताकि मैं एक निश्चित रेखा की तलाश कर सकूं, जो मुझे इसे 1000 लाइन भागों में तोड़ने की अनुमति देता है। मेरे पास सबसे बड़ी समस्या प्रदर्शन के साथ है। मैं उन फाइलों से निपट रहा हूं जिनमें 10,000,000 लाइनें हैं और जब यह पहली 10,000 लाइनें या इतनी तेज़ है, तो उस बिंदु के बाद एक विशाल घातीय मंदी है जो मुझे लगता है कि उस बिंदु की तलाश में है।फ़ाइल से पहले एक्स लाइनों को हटाएं PHP

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

यदि किसी के पास कोई समाधान या अन्य सुझाव हैं जो प्रदर्शन को तेज करेगा, तो इसकी सराहना की जाएगी।

+0

आप * सोचते हैं * समय निकाला जा रहा है? – salathe

+0

मैंने लाइन काउंटर को फिर से शुरू करने वाली रेखा पर टिप्पणी की ताकि यह हमेशा पहले 1000 भाग गया और यह तेजी से तेजी से चला।इसके अलावा यह तेजी से धीमा हो जाता है क्योंकि यह साथ जाता है, केवल एक चीज जो बदलती है वह वह रेखा है जो इसकी तलाश में होती है। –

+0

खोजना * तेजी से * अधिक समय नहीं लेना चाहिए। मंदी किस तरह के पैमाने पर है? – salathe

उत्तर

1

दुर्भाग्य से इसका कोई वास्तविक समाधान नहीं है क्योंकि फ़ाइलों को पढ़ने से पहले मुख्य स्मृति पर पूरी तरह से लोड किया जाता है।

फिर भी, मैंने यह उत्तर पोस्ट किया है क्योंकि यह एक संभावित समाधान है लेकिन मुझे संदेह है कि यह प्रदर्शन में शायद ही सुधार करता है। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।

आप फ़ाइलों को 1000 लाइनों की इकाइयों में विभाजित करने के लिए एक्सएमएल का उपयोग कर सकते हैं। और डेटा पुनर्प्राप्त करने और जोड़ने के लिए PHP के DomDocument क्लास का उपयोग करें। आप बच्चे को जोड़ सकते हैं जब आप डेटा जोड़ना चाहते हैं और पहले हज़ार लाइनों को पाने के लिए पहले बच्चे को पुनर्प्राप्त कर सकते हैं और यदि आप चाहें तो नोड को हटा दें। बस इस तरह:

<document> 
    <part> 
     . . . 
     Thousand lines here 
     . . . 
    </part> 
    <part> 
     . . . 
     Thousand lines here 
     . . . 
    </part> 
    <part> 
     . . . 
     Thousand lines here 
     . . . 
    </part> 
    . 
    . 
    . 
</document> 

एक और तरीका:

कि वास्तव में आप 1000 लाइनों में वर्गों को तोड़ने के कारण है कि आप एक अलग पंक्ति में प्रत्येक 1000 के साथ एक डेटाबेस में इसे बचा नहीं है के बारे में वास्तव में चाहते हैं तो ? ऐसा करने से आप निश्चित रूप से फ़ाइल को पढ़ने/लिखने के लिए ओवरहेड कम कर देंगे और प्रदर्शन में सुधार करेंगे।

1

ऐसा लगता है कि उद्देश्य डेटा की एक बड़ी मात्रा को पार्स करना और डेटाबेस में डालना है? यदि ऐसा है, तो मैं समझने में असफल रहा कि बिल्कुल 1000 लाइनों के साथ काम करना क्यों महत्वपूर्ण है?

मुझे लगता है कि मैं डेटा का एक बड़ा हिस्सा पढ़कर, एक बार में स्मृति में 1 एमबी कहकर, और फिर अंतिम पंक्ति समाप्त होने के लिए इन-मेमोरी खंड के अंत से पीछे स्कैन करके इसे देखता हूं। एक बार मेरे पास हो जाने के बाद, मैं फ़ाइल की स्थिति और मेरे पास अतिरिक्त डेटा को सहेज सकता हूं (जो पिछली पंक्ति से समाप्त हो गया है, जो खंड के अंत तक समाप्त होता है)। वैकल्पिक रूप से, फ़ाइल फ़ाइल को fseek() का उपयोग करके रीसेट करें, जहां फ़ाइल में मुझे अंतिम पंक्ति समाप्त होती है, आसानी से स्ट्रेल ($ खंड) के साथ पूरा किया जाता है।

इस तरह, मुझे बस इतना करना है कि विस्फोट ("\ r \ n", $ खंड) चलाकर मुझे खंड को विस्फोट कर रहा है और मेरे पास आगे की प्रक्रिया के लिए उपयुक्त रूप से बड़े ब्लॉक में सभी लाइनें हैं।

फ़ाइल की शुरुआत से लाइनों को हटाने की अनुशंसा नहीं की जाती है। यह डिस्क पर आगे और पीछे डेटा की एक बड़ी राशि को घुमाने जा रहा है।

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