2014-09-26 3 views
1

На работе мне посчастливилось исправить плохо написанный скрипт проверки подлинности url в python, выполненный кем-то другим. Это действительно грязный код, и, пытаясь исправить одну из ошибок, я нашел какое-то поведение, которое я не понимаю.python 2.7 IOError: [Errno 24] Слишком много открытых файлов:

Сценарий должен обрабатывать файл с объемом около 10 тысяч URL-адресов в нем, он должен проверять каждый URL-адрес, чтобы убедиться, что он действителен не только в его структуре, но и проверяет, существует ли он (с помощью pycurl для этого). На одной части кода, это делается:

for li in lineas: 
    liNew = "http://" + li 
    parsedUrl = urlparse.urlparse(liNew)  

В этом случае ошибка была добавление «HTTP: //» в начале строки, как делалось прежде, чем по сценарию. Поэтому я изменил код для этого:

for li in lineas: 
    liNew = li 
    parsedUrl = urlparse.urlparse(liNew)  

Теперь, с той же входной файл сценария завершается с ошибкой:

IOError: [Errno 24] Too many open files:/path/to/file/being/written/to.txt 

С liNew = "HTTP: //" + Li, файловые дескрипторы не переходят по умолчанию по умолчанию 1024, но изменение этой строки на liNew = li заставит их пережить 8000, почему?

ответ

0

With liNew = "http://" + li, file descriptors don't go over the default limit of 1024, but changing that line to liNew = li will make them go over 8000, why ??

  • перед: сломаны URL - ничего получает скачано (не открываются никакие файлы)
  • после: правильный URL - адреса сохраняются в файлах (есть 10K URLs)

Это, вероятно, не имеет смысла загружать больше, чем несколько сотен URL одновременно (пропускная способность, диск). Убедитесь, что все файлы (сокеты, файлы дисков) правильно удалены после загрузки (метод close() вызывается вовремя).

Ограничение по умолчанию (1024) низкое, но не увеличивает его, если вы не понимаете, что делает код.

+0

Да, это имеет смысл. Я переписываю все это, это такой беспорядок, что мне легче начать с нуля. – Juancho

Смежные вопросы