2012-03-04 16 views
8

मैं file_get_contents का उपयोग कर डिस्क से एक्सएमएल फाइल लोड कर रहा हूं, और एक परीक्षण के रूप में मुझे लगता है कि मैं3.99 सेकेंड में 1,000 बार उपयोग करके 156K फ़ाइल लोड कर सकता हूं। मैंने उस हिस्से को उपclass किया है जो लोडिंग करता है और इसे एक मेमकेच परत से बदल देता है, और मेरे देव मशीन पर मैं 4.54 सेकेंड में उसी दस्तावेज़ के 1000 लोड कर सकता हूं।memcache_get से file_get_contents तेज क्यों है?

मुझे खुशी है कि file_get_contents() कुछ कैशिंग क्या करेंगे, लेकिन ऐसा लगता है कि यह वास्तव में एक प्रसिद्ध कैशिंग तकनीक की तुलना में तेजी है। एक सर्वर पर, file_get_contents() का प्रदर्शन उतना ही अच्छा है जितना कोई भी प्राप्त कर सकता है?

मैं मैकपोर्ट्स, ओएस एक्स 10.6.8 के माध्यम से PHP 5.2.17 पर हूं।

संपादित करें: मैं इस आकार के एक्सएमएल दस्तावेजों पर मिल गया है, वहाँ MEMCACHE_COMPRESSED ध्वज का उपयोग में किया जा करने के लिए एक छोटे से लाभ है। Memcache के माध्यम से 1,500 भार 6.74 (बिना) के बजाय 6.44 सेकंड (संपीड़न के साथ) में किए जाते हैं। हालांकि दोनों file_get_contents से धीमे हैं, जो 5.71 सेकेंड में समान संख्या में लोड करता है।

उत्तर

8

क्योंकि file_get_contents mmap फ़ाइल है और इसलिए आपके पास केवल कुछ फ़ाइल सिस्टम कॉल होंगे और यह फ़ाइल सिस्टम कैश में समाप्त हो जाएगी। memcache में memcached (और क्लस्टर्ड कार्यान्वयन पर सर्वर से बाहर) के बाहर प्रक्रिया प्रक्रिया शामिल है।

file_get_contents() का प्रदर्शन महत्वपूर्ण रूप से फ़ाइल सिस्टम के प्रकार पर निर्भर करता है, उदाहरण के लिए एनएफएस घुड़सवार फ़ाइल सिस्टम पर एक फ़ाइल एमएमएपी नहीं है और यह एक्सेस बहुत धीमी हो सकती है। एक बहु-उपयोगकर्ता सर्वर पर, फ़ाइल सिस्टम कैश अन्य प्रक्रियाओं द्वारा तेजी से फ़्लश हो सकता है जबकि memcached कैश लगभग निश्चित रूप से स्मृति में होगा।

+0

आह, दिलचस्प। क्या आप कह रहे हैं कि एक वेब सर्वर पर जिसमें विभिन्न एक्सएमएल फाइलें हर समय लोड की जा रही हैं, कुछ मामलों में memcache दृष्टिकोण _might_ का प्रदर्शन बेहतर होगा? (मैं कम अंत लिनक्स वीपीएस पर तैनात होने की उम्मीद करता हूं, शायद 512 एमबी रैम के साथ - डिफ़ॉल्ट 64 एम के लिए बहुत मुफ्त है जो डिफ़ॉल्ट रूप से memcache रिजर्व करता है।) – halfer

+0

फिर भी, मुझे आश्चर्य है कि विवाद जो एफएस कैश से कुछ खटखटाएगा, उतना ही उतना ही होगा जितना कि मेमचेचे कैश ';-) ' – halfer

+0

एक वीपीएस पर जो एक ऐप को समर्पित है, आपको सक्षम होना चाहिए सब कुछ फिट करने के लिए मिलता है। हालांकि इसके कैश "सही आकार" के लायक हैं: memcache के लिए 32 एम या कम होने पर कम करें। यदि आपका ऐप PHP आधारित है तो सुनिश्चित करें कि आप एपीसी या एक्सकैच का उपयोग कर रहे हैं। यह न भूलें कि यदि आप MySQL का उपयोग करते हैं, तो आप MySQL कैश को ट्यून करने से अच्छा प्रदर्शन लाभांश प्राप्त कर सकते हैं ... 512 एमबी इतना छोटा है कि आपको बुद्धिमानी से आवंटित करने की आवश्यकता है। – TerryE

3

file_get_contents फ़ाइल पुनर्प्राप्त करने का सबसे आसान तरीका है। अंतर्निहित ऑपरेटिंग सिस्टम (विशेष रूप से लिनक्स) में पहले से ही कुशल कैशिंग तंत्र हैं। आप जो कुछ भी करते हैं वह सिर्फ ऊपर की ओर बनाता है और चीजों को धीमा कर देता है।

अगर आप इन फ़ाइलों को दूरस्थ स्थान से लोड करते हैं तो मेमकैच समझ में आ जाएगा।

संपादित करें: यह आवश्यक नहीं है कि file_get_contents सबसे आसान तरीका है। fopen/fget भी तेज़ हो सकता है - मुझे नहीं पता। लेकिन अंतर एक कैशिंग परत की जटिलता की तुलना में मामूली होना चाहिए।

+0

मुझे उम्मीद है कि आप सही हैं। मुझे लगता है कि मैं हर समय _some_ डिस्क गतिविधि करने के लिए 'file_get_contents' की अपेक्षा कर रहा था (शायद यह देखने के लिए कि कोई फ़ाइल बदल गई है), जबकि' memcache_get' को बिल्कुल कुछ भी करने की आवश्यकता नहीं है। इसलिए मेरी उम्मीद है कि memcache दृष्टिकोण तेजी से होगा ... फिर भी यह समय बर्बाद नहीं हुआ है, क्योंकि मुझे लगता है कि मैंने अभी कुछ सीखा है :) – halfer

+0

एक बहुत सामान्यीकृत स्तर पर एफएस कैश आपके PHP के समान काम करता है memcache - सिवाय इसके कि यह एक और अधिक विशिष्ट है और एक पटकथा भाषा में लिखा नहीं है। :) कैश को दूसरी बार फ़ाइल तक पहुंचने की आवश्यकता नहीं है जब तक कि फ़ाइल सामग्री बदली न जाए। फ़ाइल कैश को फ़्लश करने वाली प्रणाली पर बहुत सी आईओ गतिविधि होने पर एक अलग कैशिंग तंत्र समझ में आ जाएगा। – Someone

+0

@TerryE के लिए एक टिक, मंट्रियूर के लिए एक +1 - दोनों बहुत उपयोगी हैं। धन्यवाद। – halfer

1

memcache में XML फ़ाइलों को संग्रहीत करना मुझे बहुत कम समझ में आता है।

मैं बजाय पार्स किए गए मानों को संग्रहीत करता हूं, मुझे दोनों पढ़ने और पार्सिंग को सहेजता हूं।

+0

दरअसल, यह मेरा मूल इरादा था - जब तक मुझे पता चला कि SimpleXML ऑब्जेक्ट्स को क्रमबद्ध नहीं किया जा सकता है। स्पष्ट रूप से वे संसाधन होते हैं, जो निश्चित रूप से धारावाहिक रूप में पर्याप्त रूप से प्रदर्शित नहीं किए जा सकते हैं। – halfer

+0

संसाधन? क्या संसाधन? –

+0

संसाधन: देखें [यह उत्तर] (http://stackoverflow.com/a/5264628/472495)। – halfer