如何为简单的Perl词典应用程序正确格式化纯文本数据?

时间:2010-09-05 09:04:03

标签: perl dictionary

我有一个非常简单的字典应用程序,可以搜索和显示。它是使用Win32::GUI模块构建的。我将字典所需的所有纯文本数据放在__DATA__部分下。脚本本身很小但是__DATA__部分下的所有内容都是30 MB。为了与我的朋友分享工作,然后我使用具有最高压缩级别9的PAR::Packer模块的PP实用程序将脚本打包到一个独立的可执行文件中,现在我有一个单文件字典应用程序的大小约为17MB。

但是虽然我对单文件脚本的想法非常满意,但是在脚本的DATA部分下放置如此大量的文本数据并不合适。首先,当我尝试在Padre中打开脚本时(Notepad ++没问题),我收到的错误如下:

  

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


我的问题:

如果我将DATA部分下的所有内容移到单独的文本文件中,除了消除Padre的文件打开问题外,它是否带给我额外的好处?

如果我这样做,我该怎么做才能减小单独文件的大小?拉链并在搜索和显示时将其解压缩?

人们通常如何格式化字典应用程序所需的文本数据?

有任何意见,想法或建议吗?总是如此谢谢:)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

  

如果我这样做,我该怎么做才能减小单独文件的大小?拉链并在搜索和显示时将其解压缩?

嗯,这取决于你想减小尺寸的原因。如果要最小化磁盘空间使用(这些天大部分时间都是奇怪的目标),那么zip / unzip就是最佳选择。

但是,如果目标是最小化内存使用,那么更好的方法是将字典数据拆分为更小的块(例如,由第一个字母索引),并且仅加载所需的块。

  

人们通常如何格式化字典应用程序所需的文本数据?

恕我直言,通常的方法就是上面提到的方法(分区和索引数据)的逻辑结束:使用后端数据库,它允许您只检索哪些数据实际上是需要的。

在你的情况下,像SQLite或Berkley DB / DBM文件这样简单的东西应该没问题。

  

如果我将DATA部分下的所有内容移到单独的文本文件中,除了消除Padre的文件打开问题外,它是否带给我额外的好处?

这在某种程度上取决于您的使用情况......如果这是一个由3人使用的永不改变的脚本,可能没有任何实际好处。

通常,它会使维护变得更加容易(您可以单独更改字典和代码逻辑 - 将病毒定义文件与防病毒可执行文件视为真实世界的示例)。

如果你采用我上面提到的方法,它也会减少进程内存消耗。