Запись в файл не сбрасывает содержимое автоматически и приводит к нехватке памяти в Python - PullRequest
1 голос
/ 26 февраля 2010

Я сделал простую программу на 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() вызывался автоматически при перегрузке файлового буфера или около того.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 26 февраля 2010

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

r = range(100000000)
0 голосов
/ 26 февраля 2010

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

f = open('data.txt', 'w', 5000)
...