Push-вызов в массиве перезаписи Perl - PullRequest
0 голосов
/ 29 июля 2010

Хорошо, вот сделка.У меня есть массив (введенный из файла 400 МБ), где, если я запускаю команду sort (), компу не хватает памяти.Входной файл не является проблемой, поэтому я решил разбить исходный массив на меньшие массивы, с которыми я могу выполнить сортировку.Я могу разбить исходный массив на массивы размером 100 КБ, что и делает мой код.

(для целей этого тестирования я сократил файл с 400 МБ до 40 МБ)

Я запускаю свой код массива прерываний, и на первой итерации у меня есть массив 100 КБ в качестве ссылки в моем @arrayList.Мой код просто так:

push @arrayList, \@sorted;        #@sorted is the sorted version of the 100k array
$temp = @arrayList;               #returns 1, which it should 
@arrayTemp2 = @{$arrayList[0]};
$temp = @arrayTemp2;              #returns 100k, which it should
@arrayTemp2 = @{$arrayList[1]};
$temp = @arrayTemp2;              #returns 0 since it is uninitialized

На следующем цикле в цикле for отсортированный массив является остальной частью исходного массива, только 23 КБ.Тот же код выполняется снова, с такими результатами:

push @arrayList, \@sorted;        #@sorted is the sorted version of the 23k array
$temp = @arrayList;               #returns 2, which it should 
@arrayTemp2 = @{$arrayList[0]};
$temp = @arrayTemp2;              #returns 23301, which is wrong
@arrayTemp2 = @{$arrayList[1]};
$temp = @arrayTemp2;              #returns 23301, which is right.

Я пытался использовать разные способы, чтобы придумать это, и у меня просто не осталось идей.Любая помощь?

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 июля 2010

Если ваш цикл использует ту же самую переменную @sorted (то есть, она объявлена ​​/ впервые использовалась вне области действия цикла), то Perl работает здесь, как и ожидалось. \@sorted - это ссылка на отсортированный массив, и поэтому она всегда совпадает со значением current , равным @sorted, а не со значением в момент первого обращения.

2 голосов
/ 29 июля 2010

В зависимости от того, как вы ее определяете, при обновлении @sorted вы можете перезаписывать память. Посмотрите, даст ли это вам лучшие результаты:

push @arrayList, [ @sorted ];    # an array reference to a *copy* of @sorted
...