Относительно perl tie::File Module

У меня есть два вопроса о модуле tie::file

  1. Я использовал модуль tie::file для поиска в файле размером 55 МБ и установил память 20 МБ в tie::file. Когда я пытался найти связанный массив для строки поиска, это заняло много времени. Есть ли какая-нибудь работа для этого?

  2. Может tie::file использоваться для чтения бинарного файла. Связанный массив разделяется символом "\n". Как использовать tie::file для чтения бинарного файла? Не могли бы вы вставить мне пример кода.

/home/a814899> perl -e 'напечатать "x\n"x27 для 1..1024*1024;' >а

/home/a814899> echo "привет, мир" >> a

Using Unix grep

/home/a814899> time grep "hello " a
hello world

real    0m8.280s
user    0m8.129s
sys     0m0.139s

Using the regex

/home/a814899> (time perl -e 'while (<>) { if (/hello/) { print "hello world"} }' a)
hello world
real    0m51.316s
user    0m51.087s
sys     0m0.189s


Using Perl Grep

#!/usr/bin/perl
print "executing\n";
my $outputFileDir="/home/a814899";
my $sFileName="a";
open my $fh, "<", $outputFileDir . "/" . $sFileName or do {
       print "Could not open the file";
    };
print "success  in open" . "\n";
my @out=grep {/hello world/} <$fh> ;
print "@out" ;
close($fh)

person Arav    schedule 17.01.2013    source источник
comment
Tie:File может быть заведомо медленным для больших файлов. Есть ли в вашем бинарном файле записи определенной длины? Возможно, было бы полезно поделиться тем, что вы пытаетесь сделать.   -  person Kenosis    schedule 18.01.2013
comment
Как вы думаете, зачем вам нужен Tie::File?   -  person ikegami    schedule 18.01.2013
comment
Вы можете прочитать документацию модуля — она включает разделы о том, что считается «записью». разделитель» и о возможных оптимизациях. Кроме того, tieing файлы часто не нужны.   -  person amon    schedule 18.01.2013


Ответы (1)


  1. да.

    Вот как вы, вероятно, сделали это, используя Tie::File:

    $ (
        time perl -MTie::File -e'
           tie @a, "Tie::File", $ARGV[0];
           for (@a) { if (/y/) { } }
        ' a
    ) 2>&1 | grep real
    real    2m44.333s
    

    Это «обходной путь»:

    $ (
        time perl -e'
            while (<>) { if (/y/) { } }
        ' a
    ) 2>&1 | grep real
    real    0m0.644s
    

    Файл данных был создан с использованием

    $ perl -E'say "x"x54 for 1..1024*1024;' >a
    
  2. Tie::File не читает файлы; Tie::File предоставляет средства сопоставления строк файла с элементами массива. Поскольку «двоичные» файлы не имеют строк, доступ к ним с помощью Tie::File не имеет никакого смысла.

person ikegami    schedule 18.01.2013
comment
Большое спасибо за информацию. Если я собираюсь искать огромный файл несколько раз, это займет много времени. Мысль Многократный поиск в массиве будет выполняться быстрее при использовании модуля Tie::file. В модуле Tie::File была опция Память, для которой я указал 20 МБ. Думал File Module читает текстовый файл размером 20 Мб, кладет его в память и компонует в массив. Не знаю, почему это занимает много времени. Также для чтения бинарного файла Думал, сможет ли модуль Tie::File поместить каждый байт в большом файле в массив. Буду использовать так, как вы сказали. - person Arav; 21.01.2013
comment
Читал руководство, в котором говорилось, что для больших файлов используйте Tie:: File Module. В каком случае для большого файла мне нужно использовать модуль Tie::File. Grep занимает много времени для связанного массива. Также большое спасибо за команду, которую вы разместили. был весьма полезен. - person Arav; 21.01.2013
comment
Многократный поиск в массиве будет выполняться быстрее при использовании модуля Tie::file. Хм???? 2:44.0 * $many_times не будет быстрее, чем 0:00.6 * $many_times. - person ikegami; 22.01.2013
comment
Думал, File Module читает текстовый файл размером 20 МБ. Вы сказали, что у вас есть файл размером 55 МБ. - person ikegami; 22.01.2013
comment
Читал руководство, в нем говорилось, что для больших файлов используйте модуль Tie::File Ух ты, вы обнаружите, что Tie::File не работает для вас, но вы все равно хотите его использовать, потому что какое-то руководство сказало вам это? Вау! Я думал, вы сказали, что не хотите тратить три минуты на работу, которая стоит 1 секунды, но вам это подходит. - person ikegami; 22.01.2013
comment
Думал, сможет ли модуль Tie::File поместить каждый байт большого файла в массив. Накладные расходы были бы причудливо безумными. - person ikegami; 22.01.2013
comment
Большое спасибо за информацию. Я не собираюсь использовать модуль Tie::File. Пытался узнать, в каких случаях мне нужно его использовать. Я отредактировал вопрос и вставил его различными способами, которые пробовал. Создан образец файла размером 54 МБ, разделенный новой строкой. Когда я пытался использовать unix grep, это было быстрее. Но когда я использовал perl grep, возникла ошибка нехватки памяти. Не уверен, почему это так. Пробовал так, как вы мне сказали, это занимает больше времени, чем unix grep. Означает ли это, что использование обратной кавычки и использование unix grep является самым быстрым в программе Perl? - person Arav; 22.01.2013
comment
Я буду использовать backtip и unix grep. Спасибо. Но не знаете, почему perl grep не работает с ошибкой нехватки памяти? - person Arav; 22.01.2013
comment
Это не. Загрузка всего файла в массив. Или, возможно, сброс этого массива в стек. - person ikegami; 22.01.2013
comment
Кажется, у вас очень мало памяти, доступной для вашего процесса. Возможно, вы делаете это на машине, где не должны? Или, возможно, вы устанавливаете слишком низкий лимит? - person ikegami; 22.01.2013