2015-03-10 7 views
7

मैं विंडोज   7 - 64 बिट चला रहा हूं, जिसमें नवीनतम एक्सएएमपीपी संस्करण है जिसमें 32-बिट PHP संस्करण है।क्या PHP चुपचाप लगातार fseek-command को एक fseek कमांड में अनुकूलित करता है?

एक बहुत बड़ी फ़ाइल के लिए परीक्षण http://php.net/manual/en/function.fseek.php#112647 (PHP_MAX_INT 2147483647 से भी बड़ा) पर मैं अब यकीन है कि, कि लगातार निम्नलिखित fseeks filepointer पर निष्पादित किया जा रहा से पहले अभिव्यक्त किया जाता है।

मैं दो प्रश्न हैं:

  1. मैं तोड़ सकता है यह उचित साधनों के साथ संक्षेप (या केवल वैकल्पिक हल ऊपर के लिंक में वर्णित के साथ)?

  2. क्या यह समेकन PHP में हो रहा है (जैसा कि मुझे लगता है, हालांकि मुझे नहीं पता कि PHP में कहां है) या विंडोज   7 में?

अपने आप का जवाब: कई के साथ दो तरीके दिए कोशिश कर रहा का प्रयास अपने सिस्टम पर काम नहीं किया। इसके बजाय उन्होंने फ़ाइल पॉइंटर को PHP_MAX_INT के तहत पर अलग-अलग स्थितियों में रखा। (32-बिट पीएचपी केवल वहाँ पर अभी भी संभव है से PHP_MAX_INT करने के लिए + 8192. पढ़ना अप प्राप्त कर सकते हैं, लेकिन मैं कितनी दूर पता नहीं है।)

इसलिए सवाल मेरी विशेष मामले के लिए अप्रचलित है, 32 के रूप में -बीबी PHP केवल PHP_MAX_INT + 8192 तक की तलाश कर सकता है, जो कुछ भी आप करते हैं। I प्रश्न छोड़ दो, क्योंकि दो लोगों ने इसे वोट दिया, और हो सकता है जो सामान्य उत्तर में रूचि रखता है।

मैं यहाँ एक बग रिपोर्ट दायर:
https://bugs.php.net/bug.php?id=69213
परिणाम: एक 64-बिट PHP बिल्ड यह काम हो सकता है के साथ, लेकिन मैं यह कोशिश नहीं की।

+0

नोट: मैंने स्प्लिफाइल ऑब्जेक्ट को किसी और द्वारा सुझाए गए अनुसार नहीं किया है, क्योंकि मुझे php-manual पर भरोसा है कि SplFileObject केवल सामान्य खोज, आदि आदेशों से ऊपर एक परत होना चाहिए। और मैं इस विशिष्ट कार्य के लिए पहले से ही perl में स्थानांतरित हो चुका हूं। (जो भी php बग पक्ष पर लड़का समझ गया।) जब तक यह मुख्यधारा नहीं है तब तक मैं 64 बिट PHP निर्माण नहीं करूँगा। और मैं कुछ बहुत बड़ी फ़ाइलों को पढ़ने और लिखने के लिए पूरी तरह से पर्ल पर माइग्रेट नहीं कर रहा हूं। (और मेरे लिए SplFileObject में किसी भी वैचारिक लाभ को देखना बहुत मुश्किल है। हालांकि रखरखावकर्ता इसके बारे में "उत्साही" कहा जाता है।) – John

उत्तर

1

ऐसा नहीं है। यह वास्तव में कुछ भी डम्बर करता है।

 switch(whence) { 
      case SEEK_CUR: 
       offset = stream->position + offset; 
       whence = SEEK_SET; 
       break; 
     } 

यह PHP के fseek के लिए लागू करने की हिम्मत में है: यहाँ पीएचपी स्रोत कोड से एक टुकड़ा है। यहां क्या हो रहा है: यदि आप वर्तमान स्थिति से PHP को बताते हैं, तो यह फ़ाइल की शुरुआत से "समतुल्य" खोज में अनुवाद करता है। यह केवल तभी काम करता है जब ऑफसेट गणना अधिक नहीं होती है; यदि यह करता है, तो, offset एक हस्ताक्षरित पूर्णांक है, इसलिए यह अपरिभाषित व्यवहार है।

और, ठीक है, ऐसा इसलिए है क्योंकि PHP बफर आंतरिक रूप से स्ट्रीम करते हैं, इसलिए उन्हें कुछ करने की आवश्यकता है। लेकिन यह होना आवश्यक नहीं है।

आप शायद उस भाषा में अपना काम करने की कोशिश कर रहे हैं जो वास्तव में करता है जो आप इसे बताते हैं।

+0

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

+1

अपने कर्नेल-रंगीन चश्मे को हटा दें। इन अर्थशास्त्र का मतलब है कि कोई भी PHP प्रोग्राम फ़ाइल में 'ZEND_LONG_MAX' बाइट्स से बहुत अधिक खोज सकता है, भले ही फाइल सिस्टम और ऑपरेटिंग सिस्टम इसके लिए सक्षम हो। चूंकि 'SEEK_CUR' के PHP के कार्यान्वयन में औपचारिक, सी-मानक अर्थ में अपरिभाषित व्यवहार शामिल है। पीएचपी ऐसा नहीं करेगा जो प्रोग्रामर ने इस मामले में करने के लिए कहा था, और यह * अस्वीकार्य * होना चाहिए। – Alex

+0

@Alex: यह अलग-अलग लक्ष्य खोज मूल्यों को आजमाकर मैंने जो पाया उसे फिट बैठता है। (मेरे द्वारा लिंक की गई php-bug रिपोर्ट में अंतिम प्रविष्टि देखें।) इसलिए मैं यह उत्तर स्वीकार करता हूं। बग (या पुराना कोड) होने के साथ, वर्तमान में अंतिम उपयोगकर्ता को कोई प्रभाव नहीं पड़ता है यदि अन्य स्तरों पर अन्य अनुकूलन या बग हैं, क्योंकि उन अन्य स्तरों को कभी भी मान लिया गया मान नहीं मिलेगा। मै मानता हूँ। मैं इसमें नहीं हूँ। जैसा कि लिखा गया है, मैं एक बड़े फ़ाइल कार्य के लिए perl का उपयोग करता हूं। :) शायद आप पाए गए कोड लाइनों के साथ एक बग रिपोर्ट लिख सकते हैं, और शायद यह बेहतर हो जाएगा। :) – John

0

अगर समेकन होता तो इसे एक ऑपोड अनुकूलन के रूप में होना चाहिए या बफर के माध्यम से निम्न स्तर पर होना होगा।

मैं निम्न स्तर पर उत्तर दे सकता हूं। PHP में fseek() php धाराओं का उपयोग करके लागू किया गया है। इसे ext/standard/file.h में घोषित किया गया है और .c में परिभाषित किया गया है। इसका कार्यान्वयन php_stream_seek() को कॉल करता है जो streams.c में _php_stream_seek() के माध्यम से कॉल करता है।इसका निम्न स्तर कार्यान्वयन सादे धाराओं के आवरण के माध्यम से संभाला जाता है, जिसमें मामला या तो zend_seek या zend_fseek के माध्यम से कॉल करना चाहता है, जो बदले में 32 या 64-बिट के माध्यम से मानचित्र को seeki64 c कॉल की तलाश में ले जाता है।

तो ... यदि कोई समेकन होता है, तो यह ओपोड अनुकूलन में या ओएस या हार्डवेयर में और भी नीचे होना प्रतीत होता है। हार्ड डिस्क को निकालने के लिए बाहर निकालने के लिए हार्ड डिस्क लागू होती है और फाइल सिस्टम बफरिंग सिस्टम कम करने वाले प्रभावों को कम करने में सक्षम हो सकते हैं जिनके दुष्प्रभाव नहीं होते हैं। यदि आप डिस्क पढ़ने के समय के बारे में चिंतित हैं, तो पहले यह स्वचालित रूप से इसे संभालता है। यदि आप शायद थ्रैशिंग मेमोरी (बफर में अनावश्यक रूप से बड़ी दूरी की तलाश कर रहे हैं) से चिंतित हैं तो आप एक और दृष्टिकोण मान सकते हैं। देखें: http://www.cs.iit.edu/~cs561/cs450/disksched/disksched.html डिस्क पर समय बर्बाद करने से कैसे बचें इस बारे में अधिक जानकारी के लिए।

मुझे उम्मीद है कि इससे मदद मिलती है।

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