2011-02-27 10 views
7

डेल्फी में विशाल टेक्स्ट फ़ाइल डेटा लोड करने का सबसे अच्छा तरीका क्या है? क्या कोई ऐसा घटक है जो टेक्स्ट फ़ाइल सुपरफास्ट लोड कर सकता है?बड़ी टेक्स्ट फ़ाइल को डेल्फी में सबसे अच्छा तरीका लोड करने के लिए TStringList का उपयोग कर रहा है?

मान लें कि मेरे पास एक टेक्स्ट फ़ाइल डेटाबेस है और फिक्स लम्बाई प्रारूप में संग्रहीत है। इसमें प्रत्येक क्षेत्र में कम से कम 50 वर्णों के साथ 150 फ़ील्ड शामिल हैं। 1. यह पर्याप्त है अगर मैं TStringList.loadFromFile विधि का उपयोग करें: 1. मैं स्मृति 2. मैं यह पार्स और शायद

मेरे सवालों का प्रसंस्करण के लिए एक memdataset में संग्रहीत करना होगा में इसे लोड करने की आवश्यकता है? 2. क्या टेक्स्ट फ़ाइल में हेरफेर करने के लिए कोई और बेहतर घटक है? 3. क्या मुझे टेक्स्टफाइल से निम्न स्तर की पढ़ाई का उपयोग करना चाहिए?

अग्रिम धन्यवाद।

+0

TStrings.LoadFromFile 2 * एन मेमोरी का उपयोग करता है, बड़ी फ़ाइलों के लिए निम्न स्तर लोडर का उपयोग करना है –

उत्तर

11

TStringList कभी भी बहुत सारे टेक्स्ट के साथ काम करने का सबसे अच्छा तरीका नहीं है, लेकिन यह सबसे आसान है। अगर आपके हाथों में छोटी फाइलें हैं तो आप बिना किसी समस्या के TStringList का उपयोग कर सकते हैं। यहां तक ​​कि यदि आपके पास बड़ी फ़ाइलें हैं (बड़ी फाइलें नहीं हैं) तो आप परीक्षण उद्देश्यों के लिए TStringList का उपयोग करके आपके एल्गोरिदम का एक संस्करण लागू कर सकते हैं, क्योंकि यह समझना आसान और आसान है।

यदि आपकी फ़ाइलें बड़ी हैं, क्योंकि संभवतया आप उन्हें "डेटाबेस" कहते हैं, तो आपको वैकल्पिक तकनीकों को देखने की आवश्यकता है जो आपको डेटाबेस से जितनी आवश्यकता हो उतनी ही पढ़ने में सक्षम बनाती हैं। देखो में:

  • TFileStream
  • मेमोरी मैप की फ़ाइलें।

पुरानी "फ़ाइल" आधारित एपीआई अभी भी डेल्फी में उपलब्ध नहीं है, वे सादे पुराने हैं।

मैं कैसे उन तरीकों का उपयोग पाठ का उपयोग करने के बारे में विस्तार में जाने के लिए है क्योंकि हम हाल ही में इसी तरह के दो एसओ पर सवाल किया है नहीं जा रहा हूँ:

How Can I Efficiently Read The FIrst Few Lines of Many Files in Delphi

और

Fast Search to see if a String Exists in Large Files with Delphi

1

यदि आप अपनी समस्या के लिए सुविधाजनक पाते हैं तो TStringList का पालन करने की सलाह देते हैं। अनुकूलन एक और चीज है जिसे बाद में किया जाना चाहिए।

TStringList के लिए अनुकूलन एक वंशज वर्ग घोषित करना है जो TStrings.LoadFromStream विधि को ओवरराइड करता है - आप इसे अपनी फाइलों की संरचना को ध्यान में रखते हुए यथासंभव तेज़ी से कर सकते हैं।

2

चूंकि आपके पास एक निश्चित लंबाई है जिसके साथ आप काम कर रहे हैं, आप टीएलिस्ट पर आधारित एक टीआरआईटर और ट्रेडर के साथ एक एक्सेस क्लास बना सकते हैं जो आपके रिकॉर्ड को ध्यान में रखेगा। आपके पास TStringList का कोई ओवरहेड नहीं होगा (यह नहीं कि यह एक बुरी चीज है, लेकिन अगर आपको इसकी आवश्यकता नहीं है, तो क्यों है) और आप कक्षा में रिकॉर्ड तक पहुंच सकते हैं। आखिरकार यह उस बात पर निर्भर करता है जब आप इसे स्मृति में लोड करने के बाद डेटा के साथ पूरा करने की कोशिश कर रहे हैं। जबकि टीस्ट्रिंगलिस्ट का उपयोग करना आसान है, यह उतना कुशल नहीं है जितना "अपना खुद का रोलिंग"।

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

+0

मुझे संदेह है कि प्रत्येक पंक्ति पर पाठ की लंबाई तय की गई है; ओपी का कहना है कि 'इसमें कम से कम 50 वर्णों के साथ 150 फ़ील्ड है।' मुझे लगता है कि फिक्स मात्रा फ़ील्ड की संख्या है। –

1

यह आपके प्रश्न से पूरी तरह से स्पष्ट नहीं है कि आपको स्मृति में डेटा को लोड करने की आवश्यकता क्यों है, इससे पहले कि इन-मेमोरी डेटा सेट बनाने के लिए ... क्या आप दो मुद्दों को स्वीकार कर रहे हैं? (यानी क्योंकि आपको एक इन-मेमोरी डेटा सेट बनाने की आवश्यकता है, आपको लगता है कि आपको पहले स्रोत डेटा को पूरी तरह से स्मृति में लोड करने की आवश्यकता है? या क्या स्रोत फ़ाइल की कुछ प्रारंभिक प्री-प्रोसेसिंग है जो स्मृति में लोड की गई पूरी फ़ाइल के साथ ही संभव है (यह असंभव है और यहां तक ​​कि यदि यह मामला है, तो एक टीवीइलस्ट्रीम जैसे नौसेना के प्रवाह वस्तु के साथ जरूरी नहीं है)

लेकिन मुझे लगता है कि आप जिस उत्तर को ढूंढ रहे हैं वह प्रश्न में ठीक है ...

यदि आप इस फ़ाइल को पार्स करने के लिए लोड कर रहे हैं और आगे की प्रक्रिया के लिए एक और डेटा संरचना (डेटा सेट) शुरू/प्रारंभ करना चाहते हैं, तो मौजूदा उच्च स्तरीय डेटा संरचना का उपयोग करना एक अनावश्यक और संभावित रूप से महंगा है (शब्दों में समय का) चरण

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

इस मामले में एक TFileStream सुविधा की सर्वोत्तम संतुलन और उपयोग में आसानी प्रदान करेगा।

+0

मुझे फ़ाइलों से तुलना करने की आवश्यकता है। मेरे पास दो इनपुट फ़ाइल हैं, एक मास्टर डेटाबेस के रूप में, और दूसरी फ़ाइल की तुलना की जा सकती है। मुझे मास्टर डेटाबेस में सभी फ़ील्ड सूचीबद्ध करने की आवश्यकता है जो फ़ाइल में कुछ मूल्यों की तुलना करने के लिए मेल खाते हैं। – WishKnew

+0

यह बताता है कि आप क्या कर रहे हैं, लेकिन यह अभी भी यह स्पष्ट नहीं करता है कि आपको ऐसा करने के तरीके में ऐसा क्यों करना है। यह अभी भी मुझे स्पष्ट नहीं है कि आप जो भी वर्णन कर चुके हैं उसे करने के लिए आप स्ट्रीम का उपयोग नहीं कर सकते हैं। यदि प्रदर्शन एक चिंता है, तो मैं पहले TFileStream का उपयोग करके कार्यान्वित करता हूं - यदि प्रदर्शन एक मुद्दा बन जाता है तो आप लगभग तुरंत TMEMoryStream में परिवर्तित कर सकते हैं। यदि आवश्यक हो तो * आप * जहां आपकी विशिष्ट प्रदर्शन समस्याएं वास्तव में आती हैं, इस पर आधारित आप अधिक परिष्कृत संरचनाओं को देख सकते हैं। – Deltics

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

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