2010-12-15 14 views
5

पर्ल लंबे समय से मेरी पसंद की स्क्रिप्टिंग भाषा रही है लेकिन मैंने एक भयानक समस्या में भाग लिया है। डिफ़ॉल्ट रूप से लंबे (64 बिट) पूर्णांक के लिए कोई समर्थन नहीं है। अधिकांश समय एक पूर्णांक केवल एक स्ट्रिंग है और वे बड़ी फाइलों में तलाश करने के लिए काम करते हैं लेकिन वहां बहुत सारे स्थान हैं जो वे काम नहीं करते हैं, जैसे बाइनरी &, printf, pack, unpack, <<, >>कौन सी स्क्रिप्टिंग भाषाएं लंबे (64 बिट) पूर्णांक का समर्थन करती हैं?

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

मेरा प्रश्न है Python, PHP, और रूबी ऐसी समस्या से ग्रस्त हैं, या वे संस्करण और बिल्ड विकल्पों पर भी निर्भर करते हैं?

+7

जिज्ञासा से, किसी भी कारण का उपयोग क्यों करें; पर्याप्त नहीं है? – Hugmeir

+0

@ हूगेमेर: बस इतना धीमा है। मैं MediaWiki डंप फ़ाइलों को संसाधित कर रहा हूं जो आकार में एकाधिक टेराबाइट हो सकते हैं! – hippietrail

+1

@hippietrail, क्या आप वाकई 64 बिट नंबरों को दोषी मानते हैं? –

उत्तर

14

हाई स्पीड हार्डवेयर पूर्णांक (भाषा को मानते हुए) का आकार हमेशा कंप्रेसर को जो भी आकार पूर्णांक उपलब्ध है, उस पर निर्भर करेगा जो भाषा दुभाषिया (आमतौर पर सी) संकलित करता है।

यदि आपको क्रॉस-प्लेटफार्म/क्रॉस-वर्जन बड़ा पूर्णांक समर्थन की आवश्यकता है, तो पर्ल प्रगा use bigint; चाल करेगा। यदि आपको अधिक नियंत्रण की आवश्यकता है, bigint मॉड्यूल Math::BigInt के आसपास एक रैपर है।

उस क्षेत्र में जहां use bigint; लोड किया गया है, उस दायरे के सभी पूर्णांक पारदर्शी रूप से Math::BigInt संख्याओं में अपग्रेड किए जाएंगे। आखिरकार, किसी भी प्रकार की बड़ी संख्या लाइब्रेरी का उपयोग करते समय, 9**9**9 जैसे ट्रिन का उपयोग न करें, क्योंकि आप थोड़ी देर इंतजार कर रहे हैं :)

+0

मैंने स्वीकार किया है कि मैथ :: बिगइंट/बिगिंट अब पर्ल में सबसे अच्छा समाधान है, लेकिन मैं अभी भी थोड़ा निराश हूं, विशेष रूप से पैक "क्यू" के साथ पैक/अनपैक केवल 64-बिट बिल्ड के साथ काम करता है । – hippietrail

1

क्षमा करें सर, bigint और Math::BigInt कोर मॉड्यूल का हिस्सा हैं। बस friggin 'use उनमें से एक, यह किसी भी मंच पर काम करेगा।

+2

बिगिनट अब तक का सबसे अच्छा समाधान है, लेकिन यह मेरी लिपि को बहुत धीमा कर देता है। गणित :: Int64 बहुत बेहतर लगता है लेकिन यह कोर मॉड्यूल नहीं है। – hippietrail

+2

कोई जादू नहीं है। गैर-64 बिट्स प्लेटफ़ॉर्म पर बड़ी संख्या में क्रंचिंग धीमी है। आप अपने केक नहीं ले सकते हैं और इसे खा सकते हैं। – wazoox

+0

32-बिट प्लेटफार्मों ने लंबे समय से "बड़ी संख्या" की तुलना में विधियों का उपयोग करके 64-बिट पूर्णांक के लिए समर्थन किया है, जैसे 16-बिट प्लेटफार्मों में 32-बिट प्रकार और 8-बिट प्लेटफ़ॉर्म के 16-बिट प्रकार थे। बेशक ये देशी प्रकारों से धीमे होते हैं लेकिन वे बड़े से बड़े होते हैं। जादू की आवश्यकता नहीं है। मेरे मामले में मुझे पता है कि मुझे कभी भी 64 बिट्स की आवश्यकता नहीं होगी। – hippietrail

2

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

एकमात्र बार आपको इसके बारे में सोचने की ज़रूरत है जब आप कुछ निश्चित चौड़ाई वाली बाइनरी प्रारूप में/से जा रहे हैं। यह उचित रूप से स्पष्ट है हालांकि (यह सब के बाद निश्चित चौड़ाई है)।

+0

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

+0

@hippietrail: ठीक है, उस मामले में 64-बिट मानों का उपयोग करें। मैंने कभी भी डेटा फ़ाइल रखने वाले किसी के बारे में नहीं सुना है जो 8 एक्साबाइट्स में फिट नहीं है, लेकिन यदि आप करते हैं, तो दो फाइलें हैं। और '$ env (DEITY) 'आपको आशीर्वाद देते हैं। :-) –

3

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

+2

तो आप कभी नहीं जानते कि क्यों आपकी स्क्रिप्ट कुत्ते धीमी है, कुछ मशीन बनाम किसी अन्य पर। चालाक :) – wazoox

+1

@ वाज़ुओक्स, बेहतर तो कुछ मशीनों पर गलत परिणाम दे रहा है बल्कि दूसरों को। –

+0

ऐसा लगता है कि विंडोज़ पर पायथन 3 का मानक वितरण 64 बिट पूर्णांक का समर्थन करता है जो कि विन्डोज़ पर पर्ल का मानक वितरण तब भी नहीं करता है जब अतिरिक्त बिल्ड पैरामीटर के साथ 32-बिट प्लेटफ़ॉर्म पर 64-बिट पूर्णांक समर्थन के साथ पर्ल बनाना संभव हो । – hippietrail

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