Запись в файл не сбрасывает содержимое автоматически и вызывает нехватку памяти в Python

Я сделал простую программу на 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()

Когда я запускаю его с помощью CPython, он съедает всю доступную память ОС и ничего не записывает в файл.

Когда я запускаю его на Jython, я получаю OutOfMemoryException.

Насколько я понимаю, он хранит все в буфере памяти и никогда не сбрасывал до вызова close().

Мой вопрос: как ограничить файловый буфер и запустить автоочистку? Я не хочу вызыватьflush() вручную, я думаю, что это неправильно с точки зрения производительности. Я хочу, чтобы flush() вызывался автоматически, когда файловый буфер перегружен или около того.

Спасибо!


person crypto5    schedule 26.02.2010    source источник
comment
Обратите внимание, что str(i) + "\t" + str(random.randint(0,1000)) + "\n" обычно записывается как %d\t%d\n" % (i, random.randint(0,1000)). Это более распространенный стиль, он более надежен и может иметь лучшую производительность.   -  person Mike Graham    schedule 26.02.2010


Ответы (2)


Буферизация не проблема. Проблема заключается в вызове функции range() с гигантским аргументом, которая попытается выделить массив с большим количеством элементов. Вы получите ту же ошибку, если просто скажете

r = range(100000000)
person mob    schedule 26.02.2010
comment
Спасибо за быстрый ответ, и не могли бы вы посоветовать новичку в python, какой стиль python правильно реализовать? - person crypto5; 26.02.2010
comment
попробуйте использовать for i in xrange(10000000). - person Autoplectic; 26.02.2010

Пробовали ли вы передавать размер буфера в функцию open?

f = open('data.txt', 'w', 5000)
person David Berger    schedule 26.02.2010