복붙노트

[PYTHON] 파이썬에서 너무 많은 파일 열기

PYTHON

파이썬에서 너무 많은 파일 열기

파일 집약적 인 테스트 스위트를 작성했습니다. 잠시 후 (2h) 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] ...

이상하게도, 나는 열린 파일 기술자가 점점 늘어날 것으로 예상했다. 내 스크립트가 맞습니까?

저는 파이썬의 로거와 서브 프로세스를 사용하고 있습니다. 그것이 내 fd 누출의 원인 일 수 있습니까?

감사, 다니엘

해결법

  1. ==============================

    1.테스트 스크립트는 각 반복을 덮어 씁니다. 즉, 파일이 매번 닫히는 것을 의미합니다. 파일로 로깅과 파이프로 구성된 하위 프로세스 모두 디스크립터를 사용하기 때문에 소진 될 수 있습니다.

    테스트 스크립트는 각 반복을 덮어 씁니다. 즉, 파일이 매번 닫히는 것을 의미합니다. 파일로 로깅과 파이프로 구성된 하위 프로세스 모두 디스크립터를 사용하기 때문에 소진 될 수 있습니다.

  2. ==============================

    2.수정 된 코드는 다음과 같습니다.

    수정 된 코드는 다음과 같습니다.

    import resource
    import fcntl
    import os
    
    def get_open_fds():
        fds = []
        soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
        for fd in range(0, soft):
            try:
                flags = fcntl.fcntl(fd, fcntl.F_GETFD)
            except IOError:
                continue
            fds.append(fd)
        return fds
    
    def get_file_names_from_file_number(fds):
        names = []
        for fd in fds:
            names.append(os.readlink('/proc/self/fd/%d' % fd))
        return names
    
    fds = get_open_fds()
    print get_file_names_from_file_number(fds)
    
  3. ==============================

    3.resource.RLIMIT_NOFILE은 실제로 7이지만 resource.getrlimit ()에 대한 인덱스이며 제한 자체가 아닙니다 ... resource.getrlimit (resource.RLIMIT_NOFILE)은 상위 범위 ()가

    resource.RLIMIT_NOFILE은 실제로 7이지만 resource.getrlimit ()에 대한 인덱스이며 제한 자체가 아닙니다 ... resource.getrlimit (resource.RLIMIT_NOFILE)은 상위 범위 ()가

  4. from https://stackoverflow.com/questions/4386482/too-many-open-files-in-python by cc-by-sa and MIT license