Python: File IO — отключить добавочный сброс

Вид противоположности этот вопрос.

Есть ли способ сказать Python: «Не записывайте на диск, пока я вам не скажу». (путем закрытия или сброса файла)? Я пишу в файл в сети и предпочитаю записывать весь файл сразу.

Тем временем я пишу в буфер StringIO, а затем записываю его на диск в конце.


person Jason Coon    schedule 14.05.2009    source источник
comment
Почему? Какая возможная ценность в ожидании, когда вы закончите вычисления, чтобы стать связанным вводом-выводом?   -  person S.Lott    schedule 15.05.2009
comment
Сервер настроен на фиксацию файлового кеша перед его закрытием, и это все замедляет. Хотя это предотвращает потерю данных, файл, который я пишу, бесполезен, если он не завершен. Немедленная запись файла на диск оказалась намного быстрее.   -  person Jason Coon    schedule 15.05.2009


Ответы (3)


Нет, взгляд на руководство по Python не указывает на возможность установить размер буфера на бесконечность.

Ваше текущее решение в основном представляет собой ту же концепцию.

Вы можете использовать идею Алекса, но я бы рискнул отказаться по следующим причинам:

  1. Размер буфера при открытии ограничен 2^31-1 или 2 гигабайтами. Любое большее значение приведет к ошибке «OverflowError: long int слишком велик для преобразования в int».
  2. Кажется, это не работает:

    a = open("blah.txt", "w", 2 ** 31 - 1)
    for i in xrange(10000): 
        a.write("a")
    

Откройте файл, не закрывая python, и вы увидите текст

person Unknown    schedule 14.05.2009

Вы можете открыть свой файл с таким большим буфером, как хотите. Например, чтобы использовать до миллиарда байтов для буферизации, x=open('/tmp/za', 'w', 1000*1000*1000) -- если у вас есть сто миллиардов байтов памяти и вы хотите использовать их все, просто добавьте еще *100... ;-). Память будет потребляться только в том количестве, которое действительно необходимо, так что не беспокойтесь...

person Alex Martelli    schedule 14.05.2009

Я бы сказал, что это частично зависит от того, что вы пытаетесь сделать.

Случай, когда я столкнулся с этой проблемой, был, когда мое приложение немного медленно создавало файл, который использовался другим приложением, другое приложение получало неполные версии файла.

Я решил это, записав файл в другое место, а затем переименовав его в правильное место, как только я закончил писать.

Если вы хотите этого по другим причинам, возможно, это не поможет.

person Colin Coghill    schedule 15.05.2009
comment
Это стоит протестировать. Запись файла локально и использование ОС для его копирования в сеть может быть быстрее. спасибо - person Jason Coon; 15.05.2009