sort keys %hash
est inefficace pour un grand %hash
en ce que la mémoire sage, son à peu près équivalent à:
my @keys = keys %hash;
@keys = sort @keys;
Dans ce, il doit conserver trois copies des clés en mémoire tout en faisant le tri (une dans la hash, un dans la liste des clés, un dans la liste triée en cours de création). foreach
Les optimisations de mémoire pour les itérateurs ne s'appliquent pas.
Étant donné que le hachage est si volumineux, la meilleure option consiste à l'extraire entièrement de la mémoire. Collez-le dans un fichier BerkeleyDB. Et si vous voulez garder les clés dans l'ordre d'un hachage n'est pas la meilleure option, un arbre est. Je suggère d'utiliser un fichier Berkeley BTree. Les arbres conserveront efficacement vos données triées comme un tableau tout en fournissant une recherche rapide comme un hachage.
Voici un exemple utilisant BerkeleyDB. DB_File est plus simple et mieux documenté mais ne tire pas parti des fonctionnalités modernes de BerkeleyDB. YMMV.
use BerkeleyDB;
my $db = tie my %hash, 'BerkeleyDB::Btree',
-Filename => "your.db",
-Compare => sub { $_[1] cmp $_[0] },
-Flags => DB_CREATE;
-Compare
illustre comment fournir votre propre fonction de tri. L'interface liée sera lente. À moins que vous en ayez besoin pour agir comme un hachage, utilisez l'interface de l'objet.
Pourriez-vous nous donner un peu plus de détails sur ce que vous voulez faire avec les touches? Cela pourrait être utile pour trouver une réponse décente pour vous. Cela, ou le contenu de la boucle 'foreach' ferait aussi bien. – Zaid
Cela devrait vraiment être 'foreach ma clé $ (...' –