में एक क्रमबद्ध (मेमोरी-मैप किए गए?) फ़ाइल में बाइनरी खोज, मैं जावा पर एक पर्ल प्रोग्राम पोर्ट करने और जावा जाने के दौरान सीखने के लिए संघर्ष कर रहा हूं। मूल कार्यक्रम का एक केंद्रीय घटक Perl module है जो बाइनरी खोज (अनिवार्य रूप से, फ़ाइल के बीच में एक बाइट ऑफसेट के लिए "तलाश", निकटतम न्यूलाइन पर बैकट्रैक, तुलना करने के लिए +500 जीबी क्रमबद्ध टेक्स्ट फ़ाइल में स्ट्रिंग उपसर्ग लुकअप करता है, तुलना करें खोज स्ट्रिंग के साथ लाइन उपसर्ग, बाइट ऑफसेट के आधे/दोगुने के लिए "तलाश करें", मिलने तक दोहराएं ...)जावा
मैंने कई डेटाबेस समाधानों के साथ प्रयोग किया है लेकिन पाया है कि डेटा सेट के साथ सरासर लुकअप गति में कुछ भी नहीं है यह आकार क्या आप किसी भी मौजूदा जावा लाइब्रेरी के बारे में जानते हैं जो ऐसी कार्यक्षमता लागू करता है? यह विफल हो रहा है, क्या आप मुझे कुछ बेवकूफ उदाहरण कोड पर इंगित कर सकते हैं जो पाठ फ़ाइलों में यादृच्छिक पहुंच पढ़ता है?
वैकल्पिक रूप से, मैं नए (?) जावा I/O पुस्तकालयों से परिचित नहीं हूं, लेकिन यह 500 जीबी टेक्स्ट फ़ाइल को स्मृति-मानचित्र करने का विकल्प होगा (मैं 64-बिट मशीन पर स्मृति के साथ स्मृति के साथ हूं) और स्मृति-मैप किए गए बाइट सरणी पर बाइनरी खोज करें? मुझे इस तरह की और इसी तरह की समस्याओं के बारे में साझा करने के लिए आपके अनुभवों को सुनने में बहुत दिलचस्पी होगी।
मुझे विश्वास नहीं है कि एनआईओ बफर ऑफ़सेट के रूप में ऑफसेट के रूप में एक इंट का उपयोग करते हैं इसे 2 जीबी से अधिक के साथ उपयोग करने के लिए। आजकल मशीनों पर यह लगभग बेवकूफ है। इस संदर्भ में, जितनी जल्दी हो सके, यह यहां दिए गए संदर्भ में दृष्टिकोण को दर्शाता है। – dmeister
ध्यान दें कि FileChannel.map() फ़ंक्शन एक लंबा समय लेता है, लेकिन बाइटबफर स्वयं केवल इनट्स लेता है। आप उन फ़ाइलों का उपयोग कर सकते हैं जो 2 जीबी से काफी बड़े हैं, बस किसी विशेष मैप किए गए दृश्य को केवल 2 जीबी ही हो सकता है। (रिकॉर्ड के लिए Win32 ओएस की एक ही सीमा है) –
अच्छा बिंदु, जेसन एस –