好的,这是交易。我有一个数组(从400 MB文件输入),如果我在其上运行sort()命令,comp就会耗尽内存。输入文件不是问题,所以我决定将初始数组分解为可以执行排序的较小数组。我可以将初始数组分解为大小为100k的数组,这是我的代码所做的。
(为了进行此测试,我将文件从400 MB缩小到40 MB)
我运行我的break数组代码,在第一次迭代中,我有一个100k的数组作为我的@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循环的下一个循环中,排序的数组是初始数组的其余部分,只有23k。相同的代码再次运行,结果如下:
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.
我尝试过用我能想到的各种方法来解决这个问题,而我只是没有想法。有什么帮助吗?
由于
答案 0 :(得分:2)
根据您的范围,您可能会在更新@sorted
时覆盖您的记忆。看看这是否能给你带来更好的结果:
push @arrayList, [ @sorted ]; # an array reference to a *copy* of @sorted
答案 1 :(得分:2)
如果你的循环使用相同的@sorted
变量(也就是说,它声明/首先在循环范围之外使用),那么Perl在这里按预期工作。 \@sorted
是对已排序数组的引用,因此它始终与@sorted
的当前值相同,而不是首次引用时的值。