Разбор нескольких файлов одновременно в Perl - PullRequest
0 голосов
/ 31 декабря 2010

У меня большой набор данных (около 90 ГБ) для работы. Для каждого часа каждого дня есть файлы данных (с разделителями табуляции), и мне нужно выполнять операции со всем набором данных. Например, получить долю ОС, которые указаны в одном из столбцов. Я попытался объединить все файлы в один огромный файл и выполнить простую операцию подсчета, но она была слишком велика для памяти сервера.

Итак, я думаю, мне нужно выполнить операцию с каждым файлом за раз, а затем сложить в конце. Я новичок в Perl и особенно наивен в вопросах производительности. Как мне сделать такие операции в таком случае.

Например, два столбца файла:

ID      OS
1       Windows
2       Linux
3       Windows
4       Windows

Давайте сделаем что-нибудь простое, посчитав долю ОС в наборе данных. Итак, каждый файл .txt содержит миллионы этих строк, и таких файлов много. Что было бы наиболее эффективным способом оперировать целыми файлами.

Ответы [ 2 ]

3 голосов
/ 31 декабря 2010

Если вы не читаете весь файл в память, я не понимаю, почему размер файла должен быть проблемой.

my %osHash;

while (<>)
{
   my ($id, $os) = split("\t", $_);
   if (!exists($osHash{$os}))
   {
      $osHash{$os} = 0;
   }
   $osHash{$os}++;
}

foreach my $key (sort(keys(%osHash)))
{
   print "$key : ", $osHash{$key}, "\n";
}
1 голос
/ 31 декабря 2010

Хотя ответ Пола Томблина касался заполнения хеша, вот тот же плюс, открывающий файлы:

use strict;
use warnings;
use 5.010;
use autodie;

my @files = map { "file$_.txt" } 1..10;

my %os_count;

for my $file (@files) {
    open my $fh, '<', $file;
    while (<$file>) {
        my ($id, $os) = split /\t/;
        ... #Do something with %os_count and $id/$os here.
    }
}

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

...