2010-07-29 4 views
0

Ok, voici l'affaire. J'ai un tableau (entré à partir d'un fichier de 400 Mo) où si j'exécute la commande sort(), comp manque de mémoire. Le fichier d'entrée n'est pas le problème, j'ai donc décidé de décomposer le tableau initial en plus petits tableaux sur lesquels je peux effectuer le tri. Je peux casser le tableau initial en tableaux de taille 100k, ce que fait mon code.Appel push dans le tableau d'écrasement Perl

(pour les besoins de ce test, je l'ai se est contractée le fichier de 400 Mo à 40 Mo)

-je exécuter ma pause code tableau, et à la première itération, j'ai un tableau de 100k comme référence dans ma @arrayList. Mon code est ceci:

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 

Sur la boucle suivante dans la boucle, le tableau est trié le reste du tableau initial, seulement 23k. Même code fonctionne à nouveau, avec ces résultats:

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. 

J'ai essayé d'utiliser toutes les différentes façon dont je peux penser à résoudre ce problème, et je n'ai tout simplement pas des idées de gauche. De l'aide?

Merci

Répondre

2

Selon la façon dont vous scoping, vous pourriez remplacerez votre mémoire lorsque vous mettez à jour @sorted. Voir si cela vous donne de meilleurs résultats:

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

Et c'est vraiment aussi simple que ça ... Ça me rend triste à l'intérieur: P Merci beaucoup :) – ThePirateSheep

2

Si votre boucle utilise la même variable @sorted (qui est, il est déclaré/d'abord utilisé en dehors de la portée de la boucle), alors Perl fonctionne comme prévu ici. \@sorted est une référence au tableau trié, et donc il est toujours le même que le actuel valeur de @sorted, pas la valeur au moment où il a été référencé en premier.

Questions connexes