Как получить доступ к файлам в формате gzip без создания дополнительных процессов? - PullRequest
3 голосов
/ 14 апреля 2011

Мое приложение читает и записывает много средних и больших файлов.Я хотел бы хранить их в формате ZIP.Экономит дисковое пространство и сетевое время.

Один из способов сделать это с помощью этого:

sub fopen {
  my $mode = shift;
  my $filename = shift;

  if ($filename =~ /\.gz$/) {
    if ($mode eq "<") {
      open(my $fp, "-|", "/usr/bin/gzcat $filename");
      #my $fp = gzopen($filename, "rb") ;
      return $fp;
    }
    if ($mode eq ">") {
      open(my $fp, "|-", "/usr/bin/gzip > $filename");
      #my $fp = gzopen($filename, "wb") ;
      return $fp;
    }
  } else {
    open(my $fp, $mode, $filename);
    return $fp;
  }
}

Затем я могу изменить свой существующий код, просто поменяв местами вызовы на открытие.

Как видно из функции, я также подумал об использовании библиотеки zlib / compress.Проблема в том, что результат не может быть передан как указатель файла.

Есть ли способ сделать это, не включая создание группы дополнительных процессов?

Ответы [ 3 ]

12 голосов
/ 14 апреля 2011

Из документации IO :: Uncompress :: Gunzip

use IO::Uncompress::Gunzip qw($GunzipError);

my $z = IO::Uncompress::Gunzip->new( $input )
    or die "IO::Uncompress::Gunzip failed: $GunzipError\n";

Переменная $z теперь является дескриптором файла, который вы можете использовать как обычно.

while (<$z>) {...}
1 голос
/ 15 апреля 2011

Просто чтобы добавить информацию о предыдущих ответах, из старой скамьи, которую я сделал , PerlIO :: gzip быстрее, чем IO :: Uncompress :: Gunzip .

0 голосов
/ 14 апреля 2011

Посмотрите на пространство имен IO :: * в вашей версии Perl.

Например, Debian old-stable (5 - Lenny) Perl и последующие версии, поставляются IO :: Uncompress :: Gunzip и IO :: Uncompress :: AnyUncompress .

#!/usr/bin/perl

use strict ;
use warnings ;
use IO::Uncompress::Gunzip qw(gunzip $GunzipError);

my $input = "file1.txt.gz";
my $output = "file1.txt";

gunzip $input => $output
    or die "gunzip failed: $GunzipError\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...