скрипт на perl вылетает при создании массива?

zakysj50

#!/usr/local/bin/perl
$k = 3000;
open my $OUT, ">vol.dat" or die "Can not open/create output file: $!\n";
select $OUT;
open INPUT, "<vol_$k.dat" or die "Can not open file vol_$k.dat: $!\n";
$str = 0;
while (<INPUT>){
chomp;
$hist[$str]->[$k] = $_;
$str++;
}
close(INPUT);
close $OUT;

Почему скрипт может вылетать при создании двумерного массива? :o :confused:
При этом с некоторыми файлами все работает нормально, а для других скрипт считывает часть файла и падает :crazy: Файлы немного отличаются по размеру. Файлы - текстовые, около 540000 строчек, 2-2.5 мб.
Если $hist[$str]->[$k] = $_; заменить на $hist[$str] = $_; то программа работает для любых файлов.

Bibi

что это за поебень?
этот код — это данность? кто автор? что он должен делать?

zakysj50

Это неработающая часть кода, но не работает именно она. Цель скрипта соединить несколько файлов. Каждый файл содержит столбец данных. Всего х файлов. Нужно создать файл с х столбцами.
Я уже решила эту проблему по-другому, заменив
while (<INPUT>){
chomp;
$hist[$str]->[$k] = $_;
$str++;
}
....
цикл по $str {
цикл по $k {
print "$hist[$str]->[$k] ";
}}

на
while (<INPUT>){
chomp;
$hist[$str] .= "$_;";
$str++;
}
....
цикл по $str {
print "$hist[$str]";
}

Но все равно интересно почему первый вариант не работает.

Bibi

я правильно понял, что всего порядка 3000 файлов, каждый по 2-2.5MB? т.е. объем выходного файла порядка 7GB и скрипт это дело пишет сначал в этот двумерный массив в памяти? сколько памяти на машинке?

zakysj50

нет, файлов всего 30 ($k=100,200,300,...3000 но каждый не больше 2.5мб. Но скрипт падает даже при работе с одним просто записывая в память двумерный массив, и не падает, когда массив одномерный. Оперативной памяти на компе - 3500мб.
Не может же это быть просто глюком? :confused:

rosali

в перле нет sparse массивов, когда ты создаешь массив и заполняешь в нем только 3000-ный элемент, но все предыдущие элементы тоже аллоцируются и заполняются undef-ами. а 2.5Mb * 3000 = 7.5Gb

zakysj50

Поняла :o Спасибо! :D :D :D

tokuchu

аллоцируются и заполняются undef-ами. а 2.5Mb * 3000 = 7.5Gb
Так ведь undef != 2.5Mb ?

serega1604

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

tokuchu

подозреваю что undef должен занимать памяти порядка размера указателя на данной платформе. (в сях - размер указателя, в языках более высокого уровня может и больше получиться).
Да даже если несколько слов занимает, то всё равно массив из 3000 таких элементов — это немного.

serega1604

посчитай сколько будут отжирать 540000 массивов по 3000 элементов, каждый из которых занимает одно слово.

tokuchu

посчитай сколько будут отжирать 540000 массивов по 3000 элементов, каждый из которых занимает одно слово.
А, этот момент я пропустил. :)
Оставить комментарий
Имя или ник:
Комментарий: