PyMGet - параллельное скачивание файлов с нескольких зеркал

Ответить
 

MappingOrgUa

Помощник модератора

Стаж: 17 лет 7 месяцев

Сообщений: 9829

MappingOrgUa · 30-Авг-16 21:30 (9 лет назад)

NETDTHC
Я тебе ещё более конкретную ситуцию привожу. Не абстрактное «качать раз в месяц», а конкретно: возникла необходимость посмотреть содержимое файла в Минте. Можно выяснить через 2 минуты, можно через 10 минут. Что лучше?
[Профиль]  [ЛС] 

NETDTHC

Стаж: 13 лет 10 месяцев

Сообщений: 10551

NETDTHC · 30-Авг-16 21:58 (спустя 27 мин.)

MappingOrgUa писал(а):
71321842Я тебе ещё более конкретную ситуцию привожу. Не абстрактное «качать раз в месяц», а конкретно: возникла необходимость посмотреть содержимое файла в Минте. Можно выяснить через 2 минуты, можно через 10 минут. Что лучше?
Ну, конечно, через 2 лучше. Но нет особенной разницы в данном случае. Оно ж не 10 часов качается, и даже не час. Это несущественная разница, на которую можно и внимание не обращать. С современной скоростью интернета многие вещи потеряли смысл вообще..
Мы ж о тривиальных задачах ведь ооворим,а не об администрировании серверов, о которых VVD0 говорит.
А управляя автомобилем, ты тоже стараешься быстрее доехать, или едешь так, как тебе удобно и ненапряжно? Вот и в этом случае точно так же. Лично я не зацикливаюсь на подобных вещах. Меня напрягает, когда в определенные часы или падает скорость (пик активности юзеров) или же некоторые сервера вообще недоступны (идиоты компьютеры выключают). А если берется с нормальной скоростью - то нормально. И неважно, 12 это метров в секунду, или же 5. Все равно, когда докачается, входящий канал вообще простаивать будет. Да и у меня давно уже не бывает такого, чтобы я тупо сидел и ждал, когда оно там скачается. Поставил и забыл. Вспомнил, что нужно глянуть файл - открыл, глянул. А через 10 минут возникла эта необходимость или через 10 месяцев - вообще пофиг.
Другое дело, когда посмотреть надо срочно. Доставили человека, к примеру, и в течение срока задержания его надо "пробить" и от результата будут зависеть дальнейшип действия. Вот тогда да, надо быстро.
[Профиль]  [ЛС] 

MappingOrgUa

Помощник модератора

Стаж: 17 лет 7 месяцев

Сообщений: 9829

MappingOrgUa · 30-Авг-16 22:08 (спустя 10 мин.)

NETDTHC писал(а):
71322013Ну, конечно, через 2 лучше. Но нет особенной разницы в данном случае. Оно ж не 10 часов качается, и даже не час. Это несущественная разница, на которую можно и внимание не обращать. С современной скоростью интернета многие вещи потеряли смысл вообще..
8 минут всегда останутся 8 минутами. Это приличное время, если информация нужна прямо сейчас.
NETDTHC писал(а):
71322013Вспомнил, что нужно глянуть файл - открыл, глянул. А через 10 минут возникла эта необходимость или через 10 месяцев - вообще пофиг.
Ты похоже реально не понял. Необходимость посмотреть возникает не из-за того, что скачал файл, а файл я качаю из-за того, что возникла необходимость посмотреть. Она возникла здесь и сейчас и чем быстрее эта необходимость будет удовлетворена - тем лучше. Я тебе скажу, что даже 2 минуты в этой ситуации - слишком много. Но здесь уже технические препятствия.
[Профиль]  [ЛС] 

NETDTHC

Стаж: 13 лет 10 месяцев

Сообщений: 10551

NETDTHC · 30-Авг-16 22:25 (спустя 16 мин.)

MappingOrgUa писал(а):
71322082Необходимость посмотреть возникает не из-за того, что скачал файл, а файл я качаю из-за того, что возникла необходимость посмотреть
Да это я понял.
MappingOrgUa писал(а):
71322082Она возникла здесь и сейчас и чем быстрее эта необходимость будет удовлетворена - тем лучше
Баба захотела перепихнуться - ты побежишь, бросая все дела, ее удовлетворять? Или ты сначала закончишь свои дела перед этим, если чем-то занимаешься в данный момент?
MappingOrgUa писал(а):
71322082Я тебе скажу, что даже 2 минуты в этой ситуации - слишком много. Но здесь уже технические препятствия.
А вспомни, как 15 лет назад 2 гига неделю качали. И какие матюки сыпались, если вдруг оборвется.. А сейчас 2 минуты долго уже.. Нужно просто не думать о том, что что-то качается (компилируется, кодируется) и т. д. Я это пытаюсь тебе объяснить. Но никак не утверждаю, что медленно качать лучше.
[Профиль]  [ЛС] 

MappingOrgUa

Помощник модератора

Стаж: 17 лет 7 месяцев

Сообщений: 9829

MappingOrgUa · 30-Авг-16 22:27 (спустя 2 мин.)

NETDTHC писал(а):
71322181Или ты сначала закончишь свои дела перед этим, если чем-то занимаешься в данный момент?
Ты можешь понять, что узнать содержимое файла - и есть мои дела на данный момент? Так пчоему я их должен откладывать из-за низкой скорости скачивания?
NETDTHC писал(а):
71322181А вспомни, как 15 лет назад 2 гига неделю качали.
А когда-то вообще интернета не было. К чему об этом говорить?
[Профиль]  [ЛС] 

NETDTHC

Стаж: 13 лет 10 месяцев

Сообщений: 10551

NETDTHC · 30-Авг-16 22:34 (спустя 6 мин.)

MappingOrgUa писал(а):
71322197Ты можешь понять, что узнать содержимое файла - и есть мои дела на данный момент? Так пчоему я их должен откладывать из-за низкой скорости
А, ну понял теперь.
Ну просто я за компьютером обычно делаю одновременно несколько дел, поэтому если где-то что-то затягивается, я просто переключаюсь на другое, а потом к тому возвращаюсь.
[Профиль]  [ЛС] 

VVD0

Стаж: 18 лет 1 месяц

Сообщений: 3797

VVD0 · 31-Авг-16 02:45 (спустя 4 часа, ред. 31-Авг-16 02:45)

MappingOrgUa писал(а):
71314313FILE *pFile = fopen("some_file", "r");
Это высосанный из пальца пример - так никто не пишет.
Даже студентам сразу дают пример с проверкой pFile на NULL следующей строчкой после fopen и они его тиражируют. Проверку на код ошибки можно и не делать в учебных примерах, но в реальном ПО диагностика обязана быть.
По поводу ошибок в ПО на питоне - я с самого начала написал, что не записываю и не сохраняю их, поэтому придумал что-то простое для примера. Не надо мне их разбирать сейчас - это пустая трата времени. Когда в следующий раз столкнусь с реальной ошибкой - твои рассуждения вряд ли помогут, а об этом треде я могу и не вспомнить.
MappingOrgUa писал(а):
71319203Для этих целей достаточно стандартных средств. Для каждого файла создаёшь список ссылок, после чего с помощью скрипта перебираешь их пока файл не будет скачан:
Ты задолбаешь нормально это реализовывать на шеле. Получится ещё более глюкаво, чем на питоте. На шеле пишут или не сложные вещи или одноразовые, которые после использования выкидывают.
Мой юзкейс был в другом - файлов много, размеры их разные, перечень зеркал идентичный. Неплохо бы их скачать наиболее быстро, но при этом ресурсов CPU, RAM и HDD надо занимать минимально, так как это всего лишь одна из 100 мелких утилиток на этом хосте, используемая в автоматическом режиме и по расписанию.
NETDTHC
Универсализм должен быть разумным. Твой пример граничит с маразмом, а мой вполне жизненный.
[Профиль]  [ЛС] 

MappingOrgUa

Помощник модератора

Стаж: 17 лет 7 месяцев

Сообщений: 9829

MappingOrgUa · 31-Авг-16 03:01 (спустя 15 мин.)

VVD0 писал(а):
71323132Проверку на код ошибки можно и не делать в учебных примерах, но в реальном ПО диагностика обязана быть.
Точно как и try-except в питоне. Ты пойми, что аналогия 100%-я: дело в программистах, а не в языке.
VVD0 писал(а):
71323132Ты задолбаешь нормально это реализовывать на шеле.
Ну раз пока никто не реализовал это на C/C++, то наверно всё проще. Не стоит сгущать краски, решение довольно прозрачное.
Впрочем, какое это имеет отношение к проблеме, поднятой мной в этой теме? Если файлов несколько - это из другой оперы, как я уже сказал.
[Профиль]  [ЛС] 

VVD0

Стаж: 18 лет 1 месяц

Сообщений: 3797

VVD0 · 31-Авг-16 03:51 (спустя 50 мин.)

MappingOrgUa писал(а):
71323166Точно как и try-except в питоне. Ты пойми, что аналогия 100%-я: дело в программистах, а не в языке.
Не 100%. Без проверки кода ошибки ПО на C может работать корректно, только неинформативные сообщения об ошибках будут. В случае с питоном будет непонятный стектрейс, но не сегфолт. Это способствует забиванию на этот try-excrpt.
MappingOrgUa писал(а):
71323166Ну раз пока никто не реализовал это на C/C++, то наверно всё проще.
Реализовано только частично.
MappingOrgUa писал(а):
71323166Не стоит сгущать краски, решение довольно прозрачное.
Хм. Как ты на шеле проверки кодов возврата будешь делать? Вернее не задолбаешься ли? А маскировку всех входящих параметров? Может ты мало на шеле писал, и по этому утверждаешь, что это легко. Вернее так - реализовать чтобы работало на ограниченном множестве входных данных и без внешних нештатных ситуаций действительно просто, но сделать корректно работающую на всех данных при любых условиях практически невозможно. Я с шелом достаточно много ковырялся, поэтому и сужу.
MappingOrgUa писал(а):
71323166Впрочем, какое это имеет отношение к проблеме, поднятой мной в этой теме? Если файлов несколько - это из другой оперы, как я уже сказал.
for FILE in ${LIST}; do
multiget ${FILE} ${MIRRORS}
done
[Профиль]  [ЛС] 

MappingOrgUa

Помощник модератора

Стаж: 17 лет 7 месяцев

Сообщений: 9829

MappingOrgUa · 31-Авг-16 05:15 (спустя 1 час 24 мин., ред. 31-Авг-16 05:15)

VVD0 писал(а):
71323217Без проверки кода ошибки ПО на C может работать корректно, только неинформативные сообщения об ошибках будут. В случае с питоном будет непонятный стектрейс, но не сегфолт. Это способствует забиванию на этот try-excrpt.
Абсолютно необоснованное суждение. Как раз «Без проверки кода ошибки ПО на C может работать корректно» точно так способствует забиванию на контроль за ошибками.
VVD0 писал(а):
71323217Как ты на шеле проверки кодов возврата будешь делать?
Да как бы $? - уже есть в моём примере. А насчёт «задолбаюсь» - так не я же буду эти заниматься, а скрипт. А он не задолбается...
VVD0 писал(а):
71323217Вернее так - реализовать чтобы работало на ограниченном множестве входных данных и без внешних нештатных ситуаций действительно просто, но сделать корректно работающую на всех данных при любых условиях практически невозможно
Я решаю поставленную задачу как она звучит (список файлов, список зеркал - качать параллельно), а не пытаюсь создать универсальный комбайн. Ксттаи, это unix-way в отличе от всяких Nero
VVD0 писал(а):
71323217for FILE in ${LIST}; do
multiget ${FILE} ${MIRRORS}
done
Я сейчас ещё раз посмотрел multiget. Но это же чисто GUIвая прога. Ты наверно за какой-то другой multiget говоришь, о котором я не знаю?
Да и потом, это всё равно не имеет отношения к поднятой мной проблеме. Моя задача - один файл, один. Неужели это так трудно понять?
[Профиль]  [ЛС] 

NETDTHC

Стаж: 13 лет 10 месяцев

Сообщений: 10551

NETDTHC · 31-Авг-16 10:56 (спустя 5 часов)

VVD0 писал(а):
71323132Универсализм должен быть разумным. Твой пример граничит с маразмом, а мой вполне жизненный.
Как и всё, нет? Перебор всегда плохо и при этом даже полезные вещи начинают приносить вред..
С примерами и сравнениями мы действительно углубились, но ведь MappingOrgUa предложил решение конкретной задачи. Мне пофиг, что дистрибутив порой качается 10 минут вместо двух, тебя не устраивает питон. Сейчас еще кто-то зайдет и скажет, что дистрибутивы надо через торренты качать и скрипт этот не нужен. : -D
[Профиль]  [ЛС] 

VVD0

Стаж: 18 лет 1 месяц

Сообщений: 3797

VVD0 · 31-Авг-16 14:32 (спустя 3 часа, ред. 31-Авг-16 14:32)

MappingOrgUa писал(а):
71323226Абсолютно необоснованное суждение. Как раз «Без проверки кода ошибки ПО на C может работать корректно» точно так способствует забиванию на контроль за ошибками.
После получения NULL можно просто написать, что не могу открыть файл и выйти, а можно ещё и код ошибки посмотреть. В любом случае это информативней питоновского трейса.
MappingOrgUa писал(а):
71323226Да как бы $? - уже есть в моём примере. А насчёт «задолбаюсь» - так не я же буду эти заниматься, а скрипт. А он не задолбается...
Я не об этом. Ты будешь после каждого вызова любой внешней утилитки городить "if с $?"? Именно это ты задолбаешься делать. Скрипт сам себя не напишет. В общем ты какую-то х*ню-с сморозил-с.
MappingOrgUa писал(а):
71323226Я решаю поставленную задачу как она звучит (список файлов, список зеркал - качать параллельно), а не пытаюсь создать универсальный комбайн. Ксттаи, это unix-way в отличе от всяких Nero
Зачем ты переводишь разговор в какую-то непонятную сторону? Ты мне предложил реализовать вариант с много файлов на шеле. Я сказал, что качественная реализация совсем не тривиальна и даже показал ряд проблем. Какое отношение тови слова имеют к моему тезису?
MappingOrgUa писал(а):
71323226Я сейчас ещё раз посмотрел multiget. Но это же чисто GUIвая прога. Ты наверно за какой-то другой multiget говоришь, о котором я не знаю?
Да и потом, это всё равно не имеет отношения к поднятой мной проблеме. Моя задача - один файл, один. Неужели это так трудно понять?
Это псевдокод того, как твоей утилиткой можно скачать много файлов. Никакого отношения к тому multiget-у не имеет.
Вот так понятней?
Код:
for FILE in ${LIST}; do
  FILES=""
  for MIRROR in ${MIRRORS}; do
    FILES="${FILES} ${MIRROR}/${FILE}"
  done
  pymget ${FILES}
done
[Профиль]  [ЛС] 

MappingOrgUa

Помощник модератора

Стаж: 17 лет 7 месяцев

Сообщений: 9829

MappingOrgUa · 31-Авг-16 15:11 (спустя 39 мин., ред. 01-Сен-16 04:37)

VVD0 писал(а):
71325200После получения NULL можно просто написать, что не могу открыть файл и выйти, а можно ещё и код ошибки посмотреть. В любом случае это информативней питоновского трейса.
Стоп, стоп, стоп. Получив NULL можно что угодно написать - согласен. Но и получив исключение в блоке except можно написать то же самое слово в слово. В обоих случаях это зависит исключительно от программиста. разница в языках лишь в реакции на необработанные ошибки: C\C++ вываливается в неинформативный сегфолт, питон же выдаёт довольно подробный трейс. Просто ты сравниваешь правльно написанную программу на C с неправильно написанной на питоне. В само условие эксперимента закладываешь желаемый ответ. Зачем?
VVD0 писал(а):
71325200Ты будешь после каждого вызова любой внешней утилитки городить "if с $?"?
Ну если я говорю про одну единственную утилиту - wget и вызываю её в цикле, т.е. в скрипте эта строка встречается один раз, - в чём гемор?
VVD0 писал(а):
71325200Какое отношение тови слова имеют к моему тезису?
Тебе нужны шашечки или ехать? Ну то есть тебе нужно файлы скачать или получить универсальную программу на все случаи жизни. Вот что я имею в виду.
VVD0 писал(а):
71325200Это псевдокод того, как твоей утилиткой можно скачать много файлов. Никакого отношения к тому multiget-у не имеет.
Ах, вот оно что.. Но это забивание гвоздей микроскопом. Если файлов много - нет нужды разрезать их и тянуть по-частям. Опять же: незачем устанавливать по одному соединению с каждым зеркалом для каждого файла. Достотачно соединения с одним зеркалом для каждого файла, суммарно их всё равно будет много и скорость будет высокой. Ты пытаешься применить программу там, для чего она в принципе не предназначена.
UPD:
В общем, как-то так на bash выгдлядит скачивание нескольких файлов с нескольких (общих) зеркал:
get_all.sh
Код:
#!/bin/bash
FILES=`cat $1`
MIRRORS_COUNT=`wc -l $2 | awk '{print $1}'`
START_MIRROR=0
COMMANDS=""
for FILE in ${FILES}; do
    COMMANDS="${COMMANDS} ${FILE} $2 ${START_MIRROR}"
    START_MIRROR=$(( ${START_MIRROR} + 1 ))
    if [[ ${START_MIRROR} > ${MIRRORS_COUNT} ]]; then
        START_MIRROR=0
    fi
done
parallel -n3 ./download.sh ::: ${COMMANDS}
download.sh
Код:
#!/bin/bash
MIRRORS_COUNT=`wc -l $2 | awk '{print $1}'`
HEAD_MIRRORS=`head -$3 $2`
TAIL_MIRRORS=`tail -$(( ${MIRRORS_COUNT} - $3 )) $2`
MIRRORS="${TAIL_MIRRORS} ${HEAD_MIRRORS}"
for MIRROR in ${MIRRORS}; do
    wget "${MIRROR}$1" -P distfiles
    if [ $? -eq 0 ]; then
        exit 0
    fi
done
Использование:
Код:
./get_all.sh FILES MIRRORS
где FILES - файл со списком файлов, MIRRORS - файл со списком зеркал. Сохраняются файлы в папку distfiles.
Разумеется, совершенству нет предела, и усовершенствовать скрипты можно до посинения. Но основную идею я показал.
UPD2:
VVD0 писал(а):
71325200
Код:
for FILE in ${LIST}; do
  FILES=""
  for MIRROR in ${MIRRORS}; do
    FILES="${FILES} ${MIRROR}/${FILE}"
  done
  pymget ${FILES}
done
Кстати, я только сейчас обратил внимание. Твой скрипт не запустит скачивание параллельно. Все файлы будут качаться по-очереди, т.к. дойдя до вызова pymget скрипт остановит свою работу и будет ждать завершения скачивания файла. Причём сильно мелкие файлы (меньше размера блока pymget, который по-умолчанию равен 4MB) будут качаться вообще с одного зеркала (сильное уменьшение размера блока увеличивает накладные расходы на запросы к серверам, так что профит сомнителен). В итоге ты ничего не выиграешь, разве что твои файлы хотя бы по несколько десятков МБ.
[Профиль]  [ЛС] 
 
Ответить
Loading...
Error