Это не так уж и много в требовании к памяти.64-битная сборка Perl должна быть в состоянии справиться с этим.
Вы можете сэкономить память, если не используете массив чисел.Создайте цепочку из них.Это сократит накладные расходы.
$n = $a[$i];
$a[$i] = $n;
становится
$n = unpack('L', substr($s, $i*4, 4));
substr($s, $i*4, 4) = pack('L', $n);
Да, это будет медленнее.Вот экономия:
use Devel::Size qw( total_size );
my @a = (1..1000);
say total_size \@a; # 20036
my $s = qq{\0}x(4*1000);
say total_size \$s; # 4028
И это не считая всех накладных расходов и фрагментации системы управления памятью, используемой версией массива.
ПРИМЕЧАНИЕ. Это позволяет использовать только до 4 294 967 296.Для поддержки больших чисел потребуется вдвое больше памяти.