Страница 1 из 12

Разбивка выделения при закачке на части

СообщениеДобавлено: 01 мар 2016, 19:04
Parasite
Иногда при закачке какой-нибудь сложной области хотелось бы начинать качать не в один поток (а потом долго и нудно ручками перевыделять части нужного полигона, желательно непересекащиеся, чтобы стартануть параллельные потоки) - а просто поставить где-нибудь галочку "Автоматически разбить закачку на N потоков", кои все сразу и стартануть.

Предлагаю 500 рэ.

Re: Разбивка выделения при закачке на части

СообщениеДобавлено: 02 мар 2016, 12:01
zed
Т.е. ты хочешь автоматизировать процесс описанный вот здесь: Скачивание в несколько потоков ?

Re: Разбивка выделения при закачке на части

СообщениеДобавлено: 02 мар 2016, 22:02
Parasite
zed писал(а):Т.е. ты хочешь автоматизировать процесс описанный вот здесь: Скачивание в несколько потоков ?

Типа того, только не задействуя метки.

Если кратко - то я хочу, чтобы при выборе произвольного выделения к скачке - была бы возможность заранее задать число потоков, открываемых данной закачкой (и, соответственно, открывать столько же и окошек скачки). На настоящее время открывается всего 1 поток на 1 выделение - а я хочу, например, 10 неперекрывающихся sub-потоков, которые в сумме скачки дадут мне мой выделенный полигон.

Разбивать предлагаю по числу тайлов к скачке: при 100 тайлах к скачке и выборе 10 потоков на это задание - каждый, соответственно, откроет свое окошко закачки и закачает предназначенные только ему 10 тайлов\каждый. При выборе 100 потоков - 100 окошек откроются и скачают по 1му тайлу каждое.

PS: просто весьма и весьма достало обрисовывать ручками sub-полигоны (доп.процессы закачки) при прокачке какого-нибудь района весьма прихотливой формы так, чтобы и за границы всего выделения не вылезти и лишнего не накачать - и одновременно чтобы максимально эффективно разбить всю задачу между параллельными потоками. Вот есть, например, выделение "Россия" из гуглового КМЛа (полигон тысяч так на десяток-другой точек) - как мне её максимально эффективно выкачать в несколько [десятков] потоков, не вырисовывая\не открывая каждую область ручками отдельно, и не парясь с сохранением\переоткрытием сессий опять же ручками, если что-то сглючит в пути? :thumbdown:

Re: Разбивка выделения при закачке на части

СообщениеДобавлено: 02 мар 2016, 23:01
vdemidov
Parasite писал(а):Разбивать предлагаю по числу тайлов к скачке: при 100 тайлах к скачке и выборе 10 потоков на это задание - каждый, соответственно, откроет свое окошко закачки и закачает предназначенные только ему 10 тайлов\каждый. При выборе 100 потоков - 100 окошек откроются и скачают по 1му тайлу каждое.

Не, так точно реализовывать никто не будет. Максимум можно предложить разбиение на n полос равной высоты. Для каждой формируется прямоугольник и делается AND с исходным полигоном и результат передается в отдельную задачу на закачку. Некоторые тайлы на некоторых зумах будут попадать в 2 области, но что поделать.

Re: Разбивка выделения при закачке на части

СообщениеДобавлено: 03 мар 2016, 04:33
Parasite
vdemidov писал(а):Не, так точно реализовывать никто не будет.

Почему? В чем проблема?
При подсчете числа тайлов к конкретной закачке (мы же все равно их считаем заранее, перед скачкой?) и начале этой закачки - заранее "узнать", какие тайлы в какое из N окон передать и качать там. Ну, или как вариант - в каждое из открываемых окон передавать "начало старта - тайл XX, и до тайла YY", как это есть при сохранении\восстановлении сессии закачки (то есть, тупо сэмулировать восстановление N сессий "предыдущих закачек", с одним полигоном но разными стартовыми\конечными номерами тайлов в каждой). Ведь в .sls "точка возобновления закачки" же есть? Сделать и точку окончания (если нету), и воспользоваться этим механизмом при реализации сабжа.

vdemidov писал(а):Максимум можно предложить разбиение на n полос равной высоты.

Что делать с узкими закачками размером over100500 тайлов и шириной\длиной (смотря что ты имел ввиду под "полосами") <=1 тайл, то есть попадающими в понятие "полоса огромная, но таки все еще одна" - и желании разбить ее на десяток не таких огромных подзадач к скачке?

Re: Разбивка выделения при закачке на части

СообщениеДобавлено: 03 мар 2016, 12:34
vdemidov
Parasite писал(а):Почему? В чем проблема?
При подсчете числа тайлов к конкретной закачке (мы же все равно их считаем заранее, перед скачкой?) и начале этой закачки - заранее "узнать", какие тайлы в какое из N окон передать и качать там.

В том, что подсчет числа тайлов идет уже в конкретной закачке и до ее запуска количества тайлов мы не знаем. А это долгая операция и в ГУЕ ее делать нельзя. А N закачек нужно запускать именно из ГУЯ.

Parasite писал(а):Что делать с узкими закачками размером over100500 тайлов и шириной\длиной (смотря что ты имел ввиду под "полосами") <=1 тайл, то есть попадающими в понятие "полоса огромная, но таки все еще одна" - и желании разбить ее на десяток не таких огромных подзадач к скачке?

Не разбивать их на части :)

Re: Разбивка выделения при закачке на части

СообщениеДобавлено: 03 мар 2016, 15:28
Parasite
vdemidov писал(а):
Parasite писал(а):Почему? В чем проблема?
При подсчете числа тайлов к конкретной закачке (мы же все равно их считаем заранее, перед скачкой?) и начале этой закачки - заранее "узнать", какие тайлы в какое из N окон передать и качать там.

В том, что подсчет числа тайлов идет уже в конкретной закачке и до ее запуска количества тайлов мы не знаем. А это долгая операция и в ГУЕ ее делать нельзя.

Ну так полигон-то юзер выделяет ОДИН, и N раз его весь пересчитывать для каждого потока-то зачем?

Выделил юзер полигон -> посчитали его ВЕСЬ и ОДИН раз, получили например 100 тайлов -> юзер вбил "Хочу 10 потоков", нажал на старт -> тайлы 0...9 уехали в одно окно (с указанными там же, внимание, 9ю тайлами к закачке), 10...19 во второе, итд до конца. Я ж потому и предлагаю разбивать по числу тайлов, а не по "полоскам" и прочим высокоуровнемым абстракциям (а вот их - да, придется обсчитывать и перегонять в число тайлов таки каждую).

Re: Разбивка выделения при закачке на части

СообщениеДобавлено: 03 мар 2016, 15:42
vdemidov
Еще раз повторяю, подсчет тайлов идет после запуска отдельной закачки уже непосредственно в ней ибо сейчас может занимать часы времени. Простые методы распаралеливания закачки сводятся к автоматизации Скачивание в несколько потоков
Parasite писал(а):Я ж потому и предлагаю разбивать по числу тайлов, а не по "полоскам" и прочим высокоуровнемым абстракциям

Если предложенный вариант не устраивает, можешь закрывать тему на ближайшие пару лет :) Ну или предлагать сумму больше на порядок

Re: Разбивка выделения при закачке на части

СообщениеДобавлено: 03 мар 2016, 16:08
Parasite
vdemidov писал(а):Еще раз повторяю, подсчет тайлов идет после запуска отдельной закачки уже непосредственно в ней

Ну так и стартуй ее - и сразу после старта открывай из нее дочерние окна. :)
Я даже готов на то, чтобы не отдельными окошечками - а доп.полосками в том же окне закачки, или как угодно еще (на свое усмотрение). Мне лишь надо, чтобы огромные выделения эффективно разбивались на части сами при старте, и стартовали разом по нажатию одной кнопки. Все остальное вторично.

Re: Разбивка выделения при закачке на части

СообщениеДобавлено: 03 мар 2016, 16:17
vasketsov
Предлагаю не выдумывать себе сложности, чтобы потом их героические решать или отказываться от их решения, а делать максимально просто.
На N (10 и более) потоков - ОДНА очередь.
Число тайлов считается как сейчас - ОДНО.
Каждый рабочий поток просто знает, что ему надо брать не каждый тайл, а только такой тайл, где остаток от деления X+Y на N - его личный номер от 0 до N-1.
При желании можно взять не X+Y а чуть сложнее для равномерности исходя их области, это не принципиально.
Принципиально - остаток от деления на N.
Два потока никогда не схватят один и тот же файл.
Все файлы будут скачаны.
То что время завершения потоков будет не одинаковое - это не принципиально, в частности, если надо качать 4 тайла 10-ю потоками, то 6 из них сразу умрут.
voila.