J'ai un grand fichier qui contient deux nombres par ligne et qui est trié par la deuxième colonne. Je crée un dictionnaire de listes dont la clé est la première colonne.
Mon code se présente comme suit
from collections import defaultdict
d = defaultdict(list)
for line in fin.readline():
vals = line.split()
d[vals[0]].append(vals[1])
process(d)
Cependant, la taille du fichier d'entrée est trop importante. d
ne tient pas dans la mémoire.
Pour contourner ce problème, je peux en principe lire des morceaux du fichier à la fois, mais je dois faire en sorte que les morceaux se chevauchent, de sorte que process(d)
ne manquera rien.
En pseudo-code, je pourrais faire ce qui suit.
- Lire 100 lignes en créant le dictionnaire
d
. - Traiter le dictionnaire
d
- Supprimer tout ce qui se trouve dans
d
qui n'est pas à moins de 10 de la valeur maximale observée jusqu'à présent. - Nous répétons l'opération, mais en nous assurant que nous n'avons pas plus de 100 lignes de données en
d
à tout moment.
Existe-t-il un moyen simple de faire cela en Python ?
Mise à jour. Plus de détails sur le problème. J'utiliserai d
lors de la lecture d'un second fichier de paires où je produirai la paire si en fonction du nombre de valeurs dans la liste associée à la première valeur dans d
qui se situent à moins de 10. Le deuxième fichier est également trié en fonction de la deuxième colonne.
Fausses données. Supposons que nous puissions placer 5 lignes de données dans la mémoire et que nous ayons besoin que le chevauchement des valeurs soit également de 5.
1 1
2 1
1 6
7 6
1 16
Donc maintenant d est {1 :[1,6,16],2 :[1],7 :[6]}.
Pour le morceau suivant, il suffit de conserver la dernière valeur (car 16-6 > 5). Nous mettrions donc
d soit {1 :[16]} et continuer à lire la suite. 4 lignes.