2010-09-05 7 views
5

मेरे पास एक बहुत ही सरल शब्दकोश एप्लिकेशन है जो खोज और प्रदर्शन करता है। यह Win32::GUI मॉड्यूल के साथ बनाया गया है। मैंने __DATA__ अनुभाग के तहत शब्दकोश के लिए आवश्यक सभी सादा पाठ डेटा डाला। स्क्रिप्ट स्वयं बहुत छोटी है लेकिन __DATA__ सेक्शन के तहत सब कुछ के साथ, इसका आकार 30 एमबी तक पहुंचता है। मेरे दोस्तों के साथ काम साझा करने के लिए, मैंने स्क्रिप्ट को उच्चतम संपीड़न स्तर 9 के साथ PAR::Packer मॉड्यूल की पीपी उपयोगिता का उपयोग करके स्टैंड-अलोन निष्पादन योग्य में पैक किया है और अब मेरे पास एक एकल-फ़ाइल शब्दकोश ऐप है 17 एमबी का आकारसरल पर्ल शब्दकोश ऐप के लिए मैं सादे पाठ डेटा को सही ढंग से कैसे प्रारूपित करूं?

लेकिन हालांकि मैं एकल फ़ाइल स्क्रिप्ट के विचार से बहुत सहज हूं, स्क्रिप्ट के डेटा अनुभाग के तहत इतनी बड़ी मात्रा में टेक्स्ट डेटा रखने से सही नहीं लगता है। एक बात के लिए, जब मैं Padre में स्क्रिप्ट उन्हें खोलकर देखें (Notepad ++ ठीक है), मैं त्रुटि है कि तरह है प्राप्त कर रहा हूँ:

Can't open my script as the script is over the arbitrary file size limit which is currently 500000.


मेरे सवालों का:

क्या मैं पैड्रे के फ़ाइल खोलने के मुद्दे को समाप्त करने के अलावा मुझे कोई अतिरिक्त लाभ लाता हूं यदि मैं डेटा अनुभाग के तहत सब कुछ एक अलग पाठ फ़ाइल में ले जाता हूं?

यदि मैं ऐसा करता हूं, तो अलग फ़ाइल के आकार को कम करने के लिए मुझे क्या करना चाहिए? खोज और प्रदर्शन करते समय इसे ज़िप करें और इसे असम्पीडित करें?

लोग आमतौर पर एक शब्दकोश एप्लिकेशन के लिए आवश्यक टेक्स्ट डेटा को कैसे प्रारूपित करते हैं?

कोई टिप्पणी, विचार या सुझाव? हमेशा की तरह धन्यवाद :)

उत्तर

2

यदि मैं ऐसा करता हूं, तो अलग फ़ाइल के आकार को कम करने के लिए मुझे क्या करना चाहिए? खोज और प्रदर्शन करते समय इसे ज़िप करें और इसे असम्पीडित करें?

अच्छा, यह इस बात पर निर्भर करता है कि आप आकार को कम करना चाहते हैं। यदि यह डिस्क स्थान उपयोग को कम करना है (बल्कि इन दिनों अधिकतर अजीब लक्ष्य), तो ज़िप/अनजिप जाने का तरीका है।

हालांकि यदि लक्ष्य स्मृति उपयोग को कम करना है, तो बेहतर डेटा शब्दकोष को छोटे हिस्सों में विभाजित करना है (उदाहरण के लिए पहले अक्षर द्वारा अनुक्रमित), और केवल आवश्यक हिस्सों को लोड करें।

लोग आम तौर पर एक शब्दकोश एप्लिकेशन के लिए आवश्यक टेक्स्ट डेटा को कैसे प्रारूपित करते हैं?

IMHO सामान्य दृष्टिकोण क्या आपको ऐसे उपाय ऊपर उल्लेख किया है की तार्किक अंत के रूप में मिलता है (विभाजित और अनुक्रमित डेटा): एक बैक-एंड डेटाबेस, जो आप केवल डेटा जो वास्तव में है पुनः प्राप्त करने के लिए अनुमति देता है का उपयोग करते हुए जरूरत है।

आपके मामले में शायद SQLite या Berkley DB/DBM फ़ाइलों जैसे कुछ सरल होना चाहिए।

क्या यह मुझे पत्रा के फ़ाइल खोलने के मुद्दे को समाप्त करने के अलावा मुझे कोई अतिरिक्त लाभ लाता है यदि मैं डेटा अनुभाग के तहत सब कुछ एक अलग पाठ फ़ाइल में ले जाता हूं?

यह आपके उपयोग पर कुछ हद तक निर्भर करता है ... यदि यह 3 लोगों द्वारा उपयोग की जाने वाली कभी-कभी बदलने वाली स्क्रिप्ट नहीं है, तो कोई ठोस लाभ नहीं हो सकता है।

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

यदि आप उपर्युक्त दृष्टिकोणों के साथ जाते हैं तो यह प्रक्रिया मेमोरी खपत को भी कम कर देगा।

+1

इन दिनों मैं शायद डेटा को टेक्स्ट स्टोर करने के लिए पहले वाईएएमएल तक पहुंच जाऊंगा, क्योंकि इसका प्रारूप मानव-पठनीय और संपादन योग्य है, और इंटरफ़ेस का उपयोग करना और समझना बहुत आसान है (साथ ही पर्ल के एक उचित हाल के संस्करण को चलाने वाले किसी भी व्यक्ति को पहले से ही यह होना चाहिए स्थापित)। – Ether

+0

@Ether - क्या YAML स्केलेबल अच्छी तरह से यादृच्छिक लुकअप प्रदर्शन करता है? या यह एक्सएसएलटी-जैसी लुकअप के साथ सिर्फ एक स्वरूपण भाषा एएल एक्सएमएल है (30 एमबी पर, एक्सएमएल + एक्सएसएलटी प्रकार दृष्टिकोण प्रदर्शन के रूप में उचित डेटाबेस से काफी खराब हो जाता है) – DVK

+1

[वाईएएमएल केवल एक क्रमबद्धता फ्रेमवर्क है।] (Http://search.cpan.org/dist/YAML/lib/YAML.pm) यदि आप पर्ल के हैश को पैक करते हैं, तो हां, यह उचित यादृच्छिक लुक-अप प्रदान करेगा। क्योंकि यह एक हैश है। – Dummy00001

2

चूंकि आप पहले से ही PAR::Packer का उपयोग कर रहे हैं, इसे एक अलग फ़ाइल या मॉड्यूल में क्यों नहीं ले जाएं और इसे PAR फ़ाइल में शामिल करें?

आसान तरीका (pp करने के लिए कोई अतिरिक्त कमांडलाइन विकल्प, यह use बयान देख सकते हैं और सही काम करेंगे):

words.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

use Words; 

for my $i (1 .. 2) { 
    print "Run $i\n"; 
    while (defined(my $word = Words->next_word)) { 
     print "\t$word\n"; 
    } 
} 

Words.pm

package Words; 

use strict; 
use warnings; 

my $start = tell DATA 
    or die "could not find current position: $!"; 

sub next_word { 
    if (eof DATA) { 
     seek DATA, $start, 0 
     or die "could not seek: $!"; 
     return undef; 
    } 
    chomp(my $word = scalar <DATA>); 
    return $word; 
} 

1; 

__DATA__ 
a 
b 
c 
+0

मुझे यह महान सुझाव साझा करने के लिए धन्यवाद :) मैंने अभी आपके द्वारा सुझाए गए आसान तरीके का परीक्षण किया है और पीपी बस सही काम करता है! यह अच्छा है! – Mike

+0

@ माइक मैं अभी भी कठिन, सही तरीके से खेल रहा हूं। असल में यह 'pa' पंक्ति में '-a words.txt' जोड़ने के लिए नीचे आता है। अगर आप पूरी फाइल को एक बार में पढ़ना चाहते हैं, तो आप 'मेरे $ शब्द = PAR :: read_file (' words.txt ') कह सकते हैं; '। मैं अभी भी लाइनों को एक-एक करके पढ़ने की विधि पर काम कर रहा हूं। मेरा मानना ​​है कि इसमें 'PAR :: par_handle' और [' आर्काइव :: ज़िप :: सदस्य रीड'] शामिल होगा [http://search.cpan.org/dist/Archive-Zip/lib/Archive/Zip/MemberRead.pm) । –

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