[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.테스트 스크립트는 각 반복을 덮어 씁니다. 즉, 파일이 매번 닫히는 것을 의미합니다. 파일로 로깅과 파이프로 구성된 하위 프로세스 모두 디스크립터를 사용하기 때문에 소진 될 수 있습니다.
테스트 스크립트는 각 반복을 덮어 씁니다. 즉, 파일이 매번 닫히는 것을 의미합니다. 파일로 로깅과 파이프로 구성된 하위 프로세스 모두 디스크립터를 사용하기 때문에 소진 될 수 있습니다.
-
==============================
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.resource.RLIMIT_NOFILE은 실제로 7이지만 resource.getrlimit ()에 대한 인덱스이며 제한 자체가 아닙니다 ... resource.getrlimit (resource.RLIMIT_NOFILE)은 상위 범위 ()가
resource.RLIMIT_NOFILE은 실제로 7이지만 resource.getrlimit ()에 대한 인덱스이며 제한 자체가 아닙니다 ... resource.getrlimit (resource.RLIMIT_NOFILE)은 상위 범위 ()가
from https://stackoverflow.com/questions/4386482/too-many-open-files-in-python by cc-by-sa and MIT license