блокнот ipython и утечка дескрипторов файлов

У меня проблемы с утечкой файловых дескрипторов в коде, который я выполняю в блокноте ipython. Я скачиваю много файлов с urllib2 и сохраняю их локально. Очевидно, urllib2 имеет историю утечек файловых дескрипторов, что, как я подозреваю, вызывает проблемы. В итоге я получаю IoError: Too many open files.

В качестве обходного пути я периодически закрываю кучу сокетов, используя os.close. К сожалению, в ipython notebook запущено множество сокетов, которые я не хочу закрывать.

Есть ли способ определить, какие файловые дескрипторы, сокеты и т. Д. Принадлежат ipython?


person drevicko    schedule 15.03.2014    source источник


Ответы (1)


На самом деле это не ответ, но пара обходных путей на случай, если у других возникнут проблемы с утечкой файлового дескриптора.

Первый обходной путь, который, вероятно, лучше, - использовать 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