J'ai un script qui manipule de tr=C3=A8s gros dictionnaires, lus dans un
fichier et reconstruits =C3=A0 l'aide de eval(). Il y a l=C3=A0-dedans plei=
n de
cha=C3=AEnes de caract=C3=A8res, avec beaucoup de r=C3=A9p=C3=A9tition.
Malheureusement, la m=C3=A9moire utilis=C3=A9e s'envole (plus de 6 giga ave=
c 200
ou 300 mega de texte original). Y a-t-il une possibilit=C3=A9 que les cha=
=C3=AEnes
soient automatiquement pass=C3=A9es =C3=A0 intern() ? Ou bien dois-je le fa=
ire =C3=A0
la main ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Alain BARTHE
Alain Ketterlin a écrit :
Salut,
J'ai un script qui manipule de très gros dictionnaires, lus dans un fichier et reconstruits à l'aide de eval(). Il y a là-dedans plein de chaînes de caractères, avec beaucoup de répétition.
Malheureusement, la mémoire utilisée s'envole (plus de 6 giga avec 200 ou 300 mega de texte original). Y a-t-il une possibilité que les chaînes soient automatiquement passées à intern() ? Ou bien dois-je le faire à la main ?
Merci d'avance.
-- Alain.
Pourquoi le eval() ?
Je ferais plutôt : - Lire dans le fichier cle + valeur puis - dico [cle] = valeur
D'où vient le fichier texte ? S'il est géré par un appli Python (ou autre), tu gagnerais peut être à utiliser sqllite : moins de données en mémoire, les clés gérées par l'index, etc...
Il faudrait un peu plus d'infos pour répondre au problème.
Alain Ketterlin a écrit :
Salut,
J'ai un script qui manipule de très gros dictionnaires, lus dans un
fichier et reconstruits à l'aide de eval(). Il y a là-dedans plein de
chaînes de caractères, avec beaucoup de répétition.
Malheureusement, la mémoire utilisée s'envole (plus de 6 giga avec 200
ou 300 mega de texte original). Y a-t-il une possibilité que les chaînes
soient automatiquement passées à intern() ? Ou bien dois-je le faire à
la main ?
Merci d'avance.
-- Alain.
Pourquoi le eval() ?
Je ferais plutôt :
- Lire dans le fichier cle + valeur puis
- dico [cle] = valeur
D'où vient le fichier texte ?
S'il est géré par un appli Python (ou autre), tu gagnerais peut être à
utiliser sqllite : moins de données en mémoire, les clés gérées par
l'index, etc...
Il faudrait un peu plus d'infos pour répondre au problème.
J'ai un script qui manipule de très gros dictionnaires, lus dans un fichier et reconstruits à l'aide de eval(). Il y a là-dedans plein de chaînes de caractères, avec beaucoup de répétition.
Malheureusement, la mémoire utilisée s'envole (plus de 6 giga avec 200 ou 300 mega de texte original). Y a-t-il une possibilité que les chaînes soient automatiquement passées à intern() ? Ou bien dois-je le faire à la main ?
Merci d'avance.
-- Alain.
Pourquoi le eval() ?
Je ferais plutôt : - Lire dans le fichier cle + valeur puis - dico [cle] = valeur
D'où vient le fichier texte ? S'il est géré par un appli Python (ou autre), tu gagnerais peut être à utiliser sqllite : moins de données en mémoire, les clés gérées par l'index, etc...
Il faudrait un peu plus d'infos pour répondre au problème.
On Mon, 28 Sep 2009 15:22:06 +0200, Alain Ketterlin wrote:
Pour en revenir à ma question originale (l'utilisation plus ou moins automatique de intern()), je suis tout de même surpris qu'il ne soit pas plus facile d'utiliser ce mécanisme : puisque les chaînes sont immuables, autant en profiter.
Vu sa taille, j'imagine que ton fichier est auto-généré. Dans ce cas, tu peux explicitement appeler intern() dans ton dictionnaire, par exemple en écrivant i('toto') au lieu de 'toto'.
Par exemple :
s = """ {i('a a'): i('b b'), i('b b'): i('c c')} """ d = eval(s, dict(i=intern)) [(id(k), id(v)) for k, v in d.items()]
[(28633200, 28633152), (28633152, 28632912)]
d = eval(s, dict(i=intern)) [(id(k), id(v)) for k, v in d.items()]
[(28633200, 28633152), (28633152, 28632912)]
Les ids sont les mêmes... Alors qu'en n'appelant pas intern() :
d = eval(s, dict(i=lambda x: x)) [(id(k), id(v)) for k, v in d.items()]
[(28632912, 28633152), (28633152, 28633200)]
d = eval(s, dict(i=lambda x: x)) [(id(k), id(v)) for k, v in d.items()]
[(28633056, 28633200), (28633200, 28632912)]
De nouvelles chaînes ont été créées et détruites.
a+
Antoine.
On Mon, 28 Sep 2009 15:22:06 +0200, Alain Ketterlin wrote:
Pour en revenir à ma question originale (l'utilisation plus ou moins
automatique de intern()), je suis tout de même surpris qu'il ne soit pas
plus facile d'utiliser ce mécanisme : puisque les chaînes sont
immuables, autant en profiter.
Vu sa taille, j'imagine que ton fichier est auto-généré.
Dans ce cas, tu peux explicitement appeler intern() dans ton
dictionnaire, par exemple en écrivant i('toto') au lieu de 'toto'.
Par exemple :
s = """ {i('a a'): i('b b'), i('b b'): i('c c')} """
d = eval(s, dict(i=intern))
[(id(k), id(v)) for k, v in d.items()]
[(28633200, 28633152), (28633152, 28632912)]
d = eval(s, dict(i=intern))
[(id(k), id(v)) for k, v in d.items()]
[(28633200, 28633152), (28633152, 28632912)]
Les ids sont les mêmes... Alors qu'en n'appelant pas intern() :
d = eval(s, dict(i=lambda x: x))
[(id(k), id(v)) for k, v in d.items()]
[(28632912, 28633152), (28633152, 28633200)]
d = eval(s, dict(i=lambda x: x))
[(id(k), id(v)) for k, v in d.items()]
On Mon, 28 Sep 2009 15:22:06 +0200, Alain Ketterlin wrote:
Pour en revenir à ma question originale (l'utilisation plus ou moins automatique de intern()), je suis tout de même surpris qu'il ne soit pas plus facile d'utiliser ce mécanisme : puisque les chaînes sont immuables, autant en profiter.
Vu sa taille, j'imagine que ton fichier est auto-généré. Dans ce cas, tu peux explicitement appeler intern() dans ton dictionnaire, par exemple en écrivant i('toto') au lieu de 'toto'.
Par exemple :
s = """ {i('a a'): i('b b'), i('b b'): i('c c')} """ d = eval(s, dict(i=intern)) [(id(k), id(v)) for k, v in d.items()]
[(28633200, 28633152), (28633152, 28632912)]
d = eval(s, dict(i=intern)) [(id(k), id(v)) for k, v in d.items()]
[(28633200, 28633152), (28633152, 28632912)]
Les ids sont les mêmes... Alors qu'en n'appelant pas intern() :
d = eval(s, dict(i=lambda x: x)) [(id(k), id(v)) for k, v in d.items()]
[(28632912, 28633152), (28633152, 28633200)]
d = eval(s, dict(i=lambda x: x)) [(id(k), id(v)) for k, v in d.items()]