sort keys %hash
неэффективно для большого %hash
в том, что касается памяти, его примерно эквивалентно:
my @keys = keys %hash;
@keys = sort @keys;
В этом случае во время сортировки необходимо хранить три копии ключей в памяти (одна в хеше, одна в списке ключей, одна в создаваемом отсортированном списке). foreach
оптимизации памяти для итераторов не применяются.
Так как хеш очень большой, лучший вариант - полностью вывести его из памяти. Вставьте его в файл BerkeleyDB. И если вы хотите сохранить ключи в порядке, хеш не самый лучший вариант, дерево есть. Я бы предложил использовать файл Berkeley BTree. Деревья будут эффективно сохранять ваши данные отсортированными как массив, обеспечивая быстрый поиск как хеш.
Вот пример использования BerkeleyDB . DB_File проще и лучше документирован, но не использует преимущества современных функций BerkeleyDB. YMMV.
use BerkeleyDB;
my $db = tie my %hash, 'BerkeleyDB::Btree',
-Filename => "your.db",
-Compare => sub { $_[1] cmp $_[0] },
-Flags => DB_CREATE;
-Compare
иллюстрирует, как предоставить собственную функцию сортировки. Связанный интерфейс будет вялым. Если вам не нужно, чтобы он действовал как хеш, используйте интерфейс объекта.