Я получаю ошибку в программе, которая, как предполагается, работает в течение долгого времени, что слишком много файлов открыты. Есть ли какой-либо способ, которым я могу отслеживать, которых файлы открыты, таким образом, я могу иногда распечатывать тот список и видеть, где проблема?
В конце концов я обернул встроенный файловый объект в точку входа моей программы. Я обнаружил, что не закрываю свои регистраторы.
import io
import sys
import builtins
import traceback
from functools import wraps
def opener(old_open):
@wraps(old_open)
def tracking_open(*args, **kw):
file = old_open(*args, **kw)
old_close = file.close
@wraps(old_close)
def close():
old_close()
open_files.remove(file)
file.close = close
file.stack = traceback.extract_stack()
open_files.add(file)
return file
return tracking_open
def print_open_files():
print(f'### {len(open_files)} OPEN FILES: [{", ".join(f.name for f in open_files)}]', file=sys.stderr)
for file in open_files:
print(f'Open file {file.name}:\n{"".join(traceback.format_list(file.stack))}', file=sys.stderr)
open_files = set()
io.open = opener(io.open)
builtins.open = opener(builtins.open)
В Linux вы можете посмотреть на содержимое /proc/self/fd
:
$ ls -l /proc/self/fd/
total 0
lrwx------ 1 foo users 64 Jan 7 15:15 0 -> /dev/pts/3
lrwx------ 1 foo users 64 Jan 7 15:15 1 -> /dev/pts/3
lrwx------ 1 foo users 64 Jan 7 15:15 2 -> /dev/pts/3
lr-x------ 1 foo users 64 Jan 7 15:15 3 -> /proc/9527/fd
В Linux можно использовать lsof
, чтобы показать все файлы, открытые процессом.
В Windows можно использовать Проводник процесса для отображения всех файловых дескрипторов, принадлежащих процессу.
.Я полагаю, что у вас утечка дескрипторов файлов. Вероятно, вы захотите просмотреть свой код, чтобы убедиться, что вы закрываете все открываемые файлы.
.