Слишком много открытых файлов в python

Я написал своего рода набор тестов, в котором много файлов. Через некоторое время (2 часа) я получаю IOError: [Errno 24] Слишком много открытых файлов: '/ tmp / tmpxsqYPm' . Я дважды проверил все дескрипторы файлов, закрываю ли я их снова. Но ошибка все еще существует.

Я попытался вычислить количество разрешенных файловых дескрипторов, используя resource.RLIMIT_NOFILE и количество открытых в данный момент файловых дескрипторов:

def get_open_fds():

    fds = []
    for fd in range(3,resource.RLIMIT_NOFILE):
            try:
                    flags = fcntl.fcntl(fd, fcntl.F_GETFD)
            except IOError:
                    continue

            fds.append(fd)

    return fds

Итак, если я проведу следующий тест:

print get_open_fds()
for i in range(0,100):
    f = open("/tmp/test_%i" % i, "w")
    f.write("test")
    print get_open_fds()

Я получаю следующий результат:

[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...

Странно, я ожидал, что количество открытых дескрипторов файлов будет расти. Правильно ли мой сценарий?

Я использую регистратор и подпроцесс python. Может ли это быть причиной моей утечки fd?

Спасибо, Через некоторое время (2 часа) я получаю IOError: [Errno 24] Слишком много открытых файлов: '/ tmp / tmpxsqYPm' . Я дважды проверил все дескрипторы файлов, закрываю ли я их снова. Но ошибка все еще существует.

Я попытался выяснить количество разрешенных файловых дескрипторов, используя resource.RLIMIT_NOFILE и количество открытых файловых дескрипторов:

def get_open_fds():

    fds = []
    for fd in range(3,resource.RLIMIT_NOFILE):
            try:
                    flags = fcntl.fcntl(fd, fcntl.F_GETFD)
            except IOError:
                    continue

            fds.append(fd)

    return fds

Итак, если я проведу следующий тест:

print get_open_fds()
for i in range(0,100):
    f = open("/tmp/test_%i" % i, "w")
    f.write("test")
    print get_open_fds()

Я получаю следующий результат:

[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...

Странно, я ожидал, что количество открытых дескрипторов файлов будет расти. Правильно ли мой сценарий?

Я использую регистратор и подпроцесс python. Может ли это быть причиной моей утечки fd?

Спасибо, Через некоторое время (2 часа) я получаю IOError: [Errno 24] Слишком много открытых файлов: '/ tmp / tmpxsqYPm' . Я дважды проверил все дескрипторы файлов, закрываю ли я их снова. Но ошибка все еще существует.

Я попытался вычислить количество разрешенных файловых дескрипторов, используя resource.RLIMIT_NOFILE и количество открытых в данный момент файловых дескрипторов:

def get_open_fds():

    fds = []
    for fd in range(3,resource.RLIMIT_NOFILE):
            try:
                    flags = fcntl.fcntl(fd, fcntl.F_GETFD)
            except IOError:
                    continue

            fds.append(fd)

    return fds

Итак, если я проведу следующий тест:

print get_open_fds()
for i in range(0,100):
    f = open("/tmp/test_%i" % i, "w")
    f.write("test")
    print get_open_fds()

Я получаю такой результат:

[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...

Странно, я ожидал, что количество открытых файловых дескрипторов будет увеличиваться. Правильно ли мой сценарий?

Я использую регистратор и подпроцесс python. Может ли это быть причиной моей утечки fd?

Спасибо,

Я попытался выяснить количество разрешенных файловых дескрипторов, используя resource.RLIMIT_NOFILE и количество открытых в данный момент файловых дескрипторов:

def get_open_fds():

    fds = []
    for fd in range(3,resource.RLIMIT_NOFILE):
            try:
                    flags = fcntl.fcntl(fd, fcntl.F_GETFD)
            except IOError:
                    continue

            fds.append(fd)

    return fds

Итак, если я проведу следующий тест:

print get_open_fds()
for i in range(0,100):
    f = open("/tmp/test_%i" % i, "w")
    f.write("test")
    print get_open_fds()

, я получу следующее вывод:

[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...

Странно, я ожидал, что количество дескрипторов открытых файлов будет расти. Правильно ли мой сценарий?

Я использую регистратор и подпроцесс python. Может ли это быть причиной моей утечки fd?

Спасибо,

Я попытался выяснить количество разрешенных файловых дескрипторов, используя resource.RLIMIT_NOFILE и количество открытых в данный момент файловых дескрипторов:

def get_open_fds():

    fds = []
    for fd in range(3,resource.RLIMIT_NOFILE):
            try:
                    flags = fcntl.fcntl(fd, fcntl.F_GETFD)
            except IOError:
                    continue

            fds.append(fd)

    return fds

Итак, если я проведу следующий тест:

print get_open_fds()
for i in range(0,100):
    f = open("/tmp/test_%i" % i, "w")
    f.write("test")
    print get_open_fds()

, я получу следующее вывод:

[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...

Странно, я ожидал увеличения числа дескрипторов открытых файлов. Правильно ли мой сценарий?

Я использую регистратор и подпроцесс python. Может ли это быть причиной моей утечки fd?

Спасибо, Даниэль

23
задан Paul D. Waite 8 December 2010 в 10:41
поделиться