Как завершиться с сообщением об ошибке «Слишком много открытых файлов в Python» - PullRequest
1 голос
/ 19 марта 2012

Я создал 10000 файлов - мой предел по умолчанию был «ulimit -n 1024» - я ожидал, что следующий скрипт завершится ошибкой с сообщением типа «Слишком много файлов открыто», но это не удалось. (/ tmp / files имеет 10000 файлов)

Есть мысли о том, куда я иду не так?

import os
listfiles=os.listdir('/tmp/files')
count=0
f=''
for file in listfiles:
        fn=f+str(count)
        fn=open(file,'w')
        fn.write('hello')
        print 'file=',file
        count=count+1

print count

Ответы [ 3 ]

2 голосов
/ 19 марта 2012

Повторное связывание fn приводит к тому, что счетчик ссылок старого объекта падает до 0, вызывая его повторное получение.Вместо этого добавьте файлы в список.

2 голосов
/ 19 марта 2012

Цикл выводит каждый файловый объект из области видимости, поэтому он быстро закрывается, и у вас не остается больше 1 живого в любой момент (технически это может произойти из-за задержки GC).Просто добавьте каждый файловый объект в глобальный список, и вы будете хорошо разбивать свой скрипт!:)

2 голосов
/ 19 марта 2012
for file in listfiles:
        fn = f+str(count)    # what is this supposed to do?
        fn = open(file,'w')  # old file handle gets garbage collected and closed
        fn.write('hello')
        print 'file=',file
        count = count + 1

Каждый раз при повторном связывании fn предыдущий файл закрывается. Например, в jython, например, файл не закрывается сразу, но, скорее всего, он все равно будет собран и закрыт garbarge до того, как вы превысите ограничение в 1024 файла

Попробуйте сохранить файловые объекты в списке следующим образом:

import os
listfiles = os.listdir('/tmp/files')
count = 0
f = ''
fn = []
for file in listfiles:
        fn.append(open(file,'w'))
        fn[-1].write('hello')
        print 'file=',file
        count = count + 1

print count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...