Как правильно отформатировать текстовые данные для простого приложения словаря Perl? - PullRequest
5 голосов
/ 05 сентября 2010

У меня очень простое словарное приложение, которое выполняет поиск и отображение.Он построен с модулем Win32::GUI.Я поместил все данные в формате обычного текста, необходимые для словаря, в раздел __DATA__.Сам скрипт очень маленький, но со всем, что находится в разделе __DATA__, его размер достигает 30 МБ.Чтобы поделиться работой с моими друзьями, я затем упаковал скрипт в отдельный исполняемый файл, используя утилиту PP модуля PAR::Packer с самым высоким уровнем сжатия 9, и теперь у меня есть однофайловое приложение словаряразмером около 17 МБ.

Но, хотя мне очень нравится идея однофайлового скрипта, размещение такого огромного количества текстовых данных в разделе DATA скрипта кажется неправильным.Во-первых, когда я пытаюсь открыть скрипт в Padre (Notepad ++ в порядке), я получаю сообщение об ошибке:

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


Мои вопросы:

Приносит ли я какие-либо дополнительные преимущества, кроме устранения проблемы открытия файла Падре, если я переместлю все данные из раздела DATA в отдельный текстовый файл?Я делаю так, что я должен сделать, чтобы уменьшить размер отдельного файла?Заархивируйте его и распакуйте во время поиска и отображения?

Как люди обычно форматируют текстовые данные, необходимые для приложения-словаря?

Есть комментарии, идеи или предложения?Спасибо, как всегда:)

Ответы [ 2 ]

2 голосов
/ 05 сентября 2010

Если я это сделаю, что мне следует сделать, чтобы уменьшить размер отдельного файла? Сжатие и распаковка при поиске и отображении?

Ну, это зависит от того, ПОЧЕМУ вы хотите уменьшить размер. Если нужно минимизировать использование диска пространства (в наши дни это довольно странная цель), то лучше всего использовать zip / unzip.

Однако, если цель состоит в том, чтобы минимизировать использование памяти, то лучший способ - разделить данные словаря на более мелкие порции (например, проиндексированные по первой букве) и загружать только нужные порции.

Как люди обычно форматируют текстовые данные, необходимые для приложения словаря?

ИМХО обычный подход - это то, что вы получаете в качестве логического завершения подхода, упомянутого выше (секционированные и индексированные данные): с использованием внутренней базы данных , которая позволяет вам получать только те данные, которые действительно необходимо.

В вашем случае, вероятно, что-то простое, такое как файлы DBite / DBM SQLite или Berkley, должно быть в порядке.

Приносит ли мне какие-либо дополнительные преимущества, кроме устранения проблемы с открытием файла Падре, если я перенесу все данные из раздела DATA в отдельный текстовый файл?

Это в некоторой степени зависит от вашего использования ... если это неизменяемый сценарий, которым пользуются 3 человека, это может не принести ощутимых преимуществ.

В целом, это значительно облегчит обслуживание (вы можете изменить словарь и логику кода независимо друг от друга - подумайте, например, файл описаний вирусов или исполняемый файл антивируса для реального мира).

Это также уменьшит потребление памяти процесса, если вы будете использовать методы, упомянутые выше.

2 голосов
/ 05 сентября 2010

Поскольку вы уже используете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...