На самом деле это не ответ, но пара обходных путей на случай, если у других возникнут проблемы с утечкой файлового дескриптора.
Первый обходной путь, который, вероятно, лучше, - использовать subprocess.call()
для загрузки файлов, которые мне нужны с wget
. Это примерно в 4 раза быстрее, чем описанный ниже метод.
Второй обходной путь - использовать пару удобных функций, которые я нашел на SO (которые я не могу найти в данный момент - если вы их найдете, отредактируйте это или дайте мне знать, и я свяжусь):
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
С их помощью я сохраняю активные файловые дескрипторы и соответствующие имена до того, как начну скачивать файлы. Затем я периодически проверяю количество открытых файловых дескрипторов, и если оно становится опасно большим, я использую os.close()
для всех тех, которых нет в исходном списке (я также проверяю имена - сами дескрипторы перерабатываются).
Это уродливо, и иногда ноутбук ipython жалуется на такие вещи, как «не может сохранить историю» (по-видимому, я что-то забил, что он использовал), но в остальном он работает довольно хорошо.
person
drevicko
schedule
17.03.2014