Скручиваемая загрузка 2.5k + файлов слишком медленная - PullRequest
0 голосов
/ 03 октября 2010

Мне нужно скачать 2.5k + файлы, используя curl.Я использую встроенный пакетный API-интерфейс Drupals для запуска сценария curl без тайм-аута, но для захвата и сохранения файлов требуется более 10 минут.

Добавьте это к обработке реальных файлов.Потенциальная продолжительность выполнения этого скрипта составляет около 30 минут.Производительность сервера не является проблемой, так как серверы dev / staging и live работают более чем достаточно.

Я ищу предложения по улучшению скорости.Общее время выполнения не слишком велико, так как он предназначен для однократного выполнения, но было бы неплохо узнать альтернативы.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Давайте на секунду предположим, что проблема заключается в сквозной задержке, а не в пропускной способности или ЦП. Задержка в этом случае заключается в том, чтобы заставить системный вызов свернуться, создать HTTP-соединение, запросить файл и разорвать соединение.

Один из подходов состоит в том, чтобы отсеять ваши запросы и выполнять их параллельно. Вы упомянули Drupal, поэтому я предполагаю, что вы говорите о PHP здесь. Предположим также, что файлы размером 2,5 КБ перечислены в виде массива в форме URL. Вы можете сделать что-то вроде этого:

<?php
$urls = array(...);
$workers = 4;
$shard_size = count($urls) / $workers;
for ($i = 0; $i < $shard_size; $i++) {
  for ($j = 0; $j < $workers - 1; $j++) {
    system("curl " . $urls[$i * $shard_size + $j] . "&");
  }
  system("curl " . $urls[$i * $shard_size + $j]);
}
?>

Это довольно отстойно, но вы поняли идею. Он запускает подпроцессы $ worker-1, чтобы получить файлы в фоновом режиме, и запускает последнего работника на переднем плане, так что вы получаете некоторый темп. Он должен масштабироваться примерно линейно с количеством работников. Он не учитывает крайний случай, когда размер набора данных не делится поровну на количество рабочих. Могу поспорить, что вы можете принять этот подход и сделать что-то достаточно быстро.

Curl также поддерживает запрос нескольких файлов в одной командной строке, но я не знаю, достаточно ли он умен, чтобы повторно использовать существующее HTTP-соединение. Это может быть.

0 голосов
/ 09 ноября 2010

Поработав с несколькими различными методами, я пришел к выводу, что вам просто нужно стиснуть зубы и пойти на это.

Сценарию требуется некоторое время для обработки, но в нем есть много данных, которые нужно обработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...