2010-02-26 15 views
1

J'ai fait simple programme de python pour générer grand fichier texte:écriture dans le fichier ne se contente pas de rinçage et automatiquement provoquer de mémoire en Python

import sys 
import random 

f = open('data.txt', 'w') 
for i in range(100000000): 
     f.write(str(i) + "\t" + str(random.randint(0,1000)) + "\n") 
f.close() 

Quand je lance à l'aide CPython il manger toute la mémoire OS disponible et N'écris rien dans le fichier.

Lorsque je lance sur Jython je reçois OutOfMemoryException.

Pour autant que je comprends tout stocke dans la mémoire tampon et jamais avant affleurant close() appel.

Ma question est: comment limiter le tampon de fichier et déclencher autoflush? Je ne veux pas appeler manuellement flush(), je pense que c'est mal du point de vue des performances. Je veux flush() être appelé automatiquement lorsque le tampon de fichier est surchargé ou plus.

Merci!

+2

Notez que str (i) + "\ t" + str (random.randint (0,1000)) + "\ n" 'serait normalement écrit '% d \ t% d \ n"% (i, random.randint (0,1000)) '. Ceci est un style plus commun, est plus robuste, et peut avoir de meilleures performances –

Répondre

9

La mise en mémoire tampon n'est pas un problème. Le problème est d'appeler la fonction range() avec un argument géant, qui tentera d'allouer un tableau avec beaucoup d'éléments. Vous obtiendrez la même erreur si vous dites que

r = range(100000000) 
+0

Merci pour une réponse rapide, et pourrait vous conseiller pour débutant python, ce qui est le style python pour mettre en œuvre ce bien? – crypto5

+6

essayez d'utiliser 'for i in xrange (10000000)'. – Autoplectic

+2

Modifier la période de xrange –