Perl Readbackwards и сжатые файлы - PullRequest
2 голосов
/ 06 ноября 2010

Я хочу читать построчно из сжатого файла.Я знаю о модуле ReadBackwards, но как мне заставить его работать с файлом gzipped?Есть ли другой модуль, который я должен использовать?

Ответы [ 4 ]

7 голосов
/ 06 ноября 2010

Почему вы хотите прочитать это задом наперед? При попытке чтения сжатого файла в обратном направлении повышение производительности не происходит. Сначала вы должны распаковать его (чтобы понять, что означает байт n, сначала вы должны распаковать байты 0 .. n).

Вы, вероятно, не станете лучше с точки зрения скорости, чем:

#!/usr/bin/perl

use strict;
use warnings;

die "usage: $0 filename" unless defined(my $file = shift);

open my $fh, "<:gzip", $file
    or die "could not open $file: $!";

my @lines;
while (<$fh>) {
    push @lines, $_;
    shift @lines if @lines > 10;
}

print @lines;
4 голосов
/ 06 ноября 2010

Сначала вам нужно распаковать файл. Вы не можете (легко) искать в файле gziped случайным образом.

0 голосов
/ 07 ноября 2010

У меня нет отличного метода для тестирования этого, но из этого поста Я думаю, вы можете открыть файл с помощью

open my $handle, '-|', '/usr/bin/gzcat', $filename;

Это позволит вам пошагово просматривать файл, как в

foreach my $line (<$handle>) {
  do stuff with $line ...
}

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

Я также знаю, что это идет вперед, но я надеюсь, что теперь вам не нужно возвращаться назад с точки зрения памяти. Если вы все еще делаете, возможно, вы можете сделать некоторые изменения, чтобы использовать его с File :: Backwards.

Теперь у меня, похоже, нет gzcat в моей системе (Ubuntu), хотя я нахожу множество ссылок, которые говорят, что gzcat совпадает с zcat или gunzip -c или gzip -dc на имя программы YMMV. Я снова надеюсь, что метод оправдан.

0 голосов
/ 06 ноября 2010

Не хранить файл в памяти.Сохраните его в базе данных SQLite или аналогичной, с последовательным индексным полем номера строки, когда он был прочитан и вставлен в базу данных.

Когда файл полностью сохранен в БД, пройдитесь назад по строкам путем сортировкиИндекс с использованием сортировки по убыванию.При необходимости вы можете быстро перемещаться по базе данных, а также использовать запросы к базе данных для поиска строк.Это будет не так быстро, как если бы у вас было много оперативной памяти или твердотельного накопителя, но это будет намного быстрее, чем пытаться обработать сжатый файл, о котором вы говорите.

Компьютерное программирование - это поиск творческих решений при работе в ограниченных пределах.Вы ограничены оперативной памятью и тем, что работаете со сжатыми файлами.Вы должны распаковать файл, чтобы пройти назад, но вы не можете поместить его в оперативную память.Таким образом, вы должны поместить данные куда-то, и это в значительной степени оставляет диск.Проще пройти через базу данных назад, чем в виде простого файла, поэтому используйте базу данных для того, для чего она нужна, и двигайтесь дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...