В настоящее время я запускаю программу на Perl, в которой мне нужно взять текстовый файл из 1 миллиона строк, разбить его на куски (где-то от 50 до 50 000 строк на кусок) и выполнить некоторые вычисления и тому подобное. Прямо сейчас я загружаю все данные в array1. Я беру array2 и использую его для извлечения только тех фрагментов данных, которые мне нужны. Затем я делаю то, что мне нужно, для массива 2, а затем возвращаюсь и беру следующий набор.
пример данных
А, бла1, бла2
А, бла6, бла7
А, бла4, бла5
Б, бла2, бла2
Так что я собирал первые три в массив 2, сортировал их, а затем переходил к следующему набору. Моя программа поначалу работает довольно хорошо и эффективно, но позже она сильно замедляется.
50 КБ занимает 50 секунд, 100 КБ занимает 184 секунды, 150 КБ занимает 360 секунд, 200 КБ занимает 581 секунду, и по мере выполнения программы становится только экспоненциально хуже (4500 секунд в строке 500 КБ).
Нет, я не могу использовать базу данных для этого проекта, есть предложения?
my @Rows1=<FILE>;
my $temp = @Rows1;
for($k = 0; $k < $temp; $k++)
{
my @temp2array = ();
my $temp2count = 0;
my $thisrow = $Rows1[$k];
my @thisarray = split(',', $thisrow);
my $currcode = $thisarray[0];
my $flag123 = 0;
$temp2array[$temp2count] = $thisrow;
$temp2count++;
while ($flag123 == 0)
{
$nextrow = $tuRows1[$k + 1];
@nextarray = split(',', $nextrow);
if ($currcode eq $nextarray[0])
{
$temp2array[$temp2count] = $nextrow;
$k++;
$temp2count++;
}
else
{
$flag123 = 1;
}
}
}
Я отредактировал свой код, чтобы он больше походил на ответ ниже, и у меня есть такие времена:
50k = 42, 100k = 133, 150k = 280, 200k = 467, 250k = 699, 300k = 978, 350k = 1313
Это не совсем линейно, и по этой тенденции эта прога все равно будет занимать 14000+ секунд. Я исследую другие части кода