यह अनावश्यक स्कैनिंग संचालन का परिणाम देता है।
मुझे लगता है कि आप किसी बिंदु की तलाश करने के ऊपरी हिस्से का जिक्र कर रहे हैं, और फिर अगली नई सीरीज़ तक पहुंचने तक अगली मान्य सीएसवी पंक्ति प्रारंभ स्थिति को पढ़कर।
मैं इस तुलना में अधिक कुशल हो सकता है ऐसा करने के लिए तीन तरीके के बारे में सोच सकते हैं कि आप वर्तमान में क्या कर रहे हैं:
पूरी फ़ाइल पढ़ें और आगे दिशा में पंक्तियों को पार्स आउट, स्मृति में पदों के भंडारण । फिर रिवर्स ऑर्डर में इन-मेमोरी पंक्तियों को संसाधित करें।
पंक्ति से शुरू होने वाली शुरुआत से फ़ाइल को स्कैन करें, और स्मृति में पंक्ति प्रारंभ स्थिति को संग्रहीत करें। फिर रिवर्स ऑर्डर में पदों के माध्यम से पुनरावृत्त करें, प्रत्येक को इसी पंक्ति को पढ़ने के लिए खोज करें। (आप प्रत्येक खोज में एकाधिक पंक्तियों को संसाधित करके इनपुट को अधिक कुशलता से कर सकते हैं।)
MappedByteBuffer
का उपयोग कर फ़ाइल को मेमोरी में मैप करें, फिर आप पंक्ति सीमाओं को खोजने के लिए बाइट बफर आगे या पीछे से कदम उठा सकते हैं।
पहले दृष्टिकोण की आवश्यकता है कि आप स्मृति में पूरी फ़ाइल बफ़र सकते हैं, लेकिन क्योंकि आप सिस्टम कॉल की एक न्यूनतम संख्या के साथ सिर्फ एक बार फ़ाइल को पढ़ने में कम आई/ओ ओवरहेड्स है। तीसरे दृष्टिकोण में एक ही समस्या है, हालांकि आप स्मृति आवश्यकताओं को कम करने के लिए (बड़ी) खंडों में स्मृति में एक बहुत बड़ी फ़ाइल को मैप में मैप कर सकते हैं।
लेकिन आखिरकार, जावा में पीछे की फ़ाइल को पढ़ने का कोई आसान और प्रभावी तरीका नहीं है।
स्रोत
2010-12-04 04:35:00