Реклама на сайте Advertise with us

Написать на С++

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 10/01/12 в 08:11       Ответить с цитатойцитата 

Надо написать программку на С++, которая в параметрах запуска примет N-urlов, ПАРАЛЛЕЛЬНО их скачает, а контент каждого положит в файл с заданным именем и путем. Сейчас задача решается путем параллельного запуска N-wgetов, что очень плохо сказывается на произодительности.
Кто может сделать, пишите в аську 523709. Обсудим бюджет =)
P.S. должно компилиться и работать на x86 и x86_64. Все под линукс.

0
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 10/01/12 в 09:57       Ответить с цитатойцитата 

Оффтопик:
уверен, что по скорости и расходу ресурсов рнр+curl не уступает самопальному скрипту на с++


ну вот попробуй такая скорость устроит:
Код: [развернуть]

6
 



С нами с 25.07.06
Сообщения: 207
Рейтинг: 229

Ссылка на сообщениеДобавлено: 10/01/12 в 10:04       Ответить с цитатойцитата 

на c++ будет дорого и трудноподдерживаемо. рекомендую python multi-threading. фактически, та же асинхронная загрузка, но будет работать везде icon_smile.gif

что-то такое, накидал за 5 минут icon_biggrin.gif:


Код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib2
import sys
from threading import Thread

class Downloader(Thread):
    def __init__(self, url):
        Thread.__init__(self)
        self.url = url
        self.out_file = url.split('/')[-1]

    def run(self):
        print '>', self.url, 'starting'
        f = open(self.out_file, 'wb', 8096)
        u = urllib2.urlopen(self.url)
        data = u.read(8096)
        size = 0
        while data:
            f.write(data)
            size += len(data)
            print '>', self.url, size, 'bytes'
            data = u.read(8096)
        f.close()
        print '>', self.url, 'received', size, 'bytes'


if __name__ == '__main__':
    if len(sys.argv) != 2:
        print 'Use %s urllist.txt' % sys.argv[0]
        sys.exit(1)

    pool = []
    for l in open(sys.argv[1]).readlines():
        l = l.strip()
        t = Downloader(l)
        pool.append(t)
        t.start()

    print 'Waiting threads'
    for t in pool:
        t.join()


запуск - python downloader.py ulist.txt,
в ulist - список урлов по одному на строку. следи, чтобы имена файлов в урлах не повторялись для текущего каталога.

6
 

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 10/01/12 в 10:18       Ответить с цитатойцитата 

Всем поставил рейтинга по максимуму
Спасибо
Ушел тестить

0
 



С нами с 18.08.04
Сообщения: 6376
Рейтинг: 4430

Ссылка на сообщениеДобавлено: 10/01/12 в 11:28       Ответить с цитатойцитата 

Salvator писал:
на c++ будет дорого и трудноподдерживаемо. рекомендую python multi-threading. фактически, та же асинхронная загрузка, но будет работать везде icon_smile.gif

Присоединяюсь. Отлично справляется питончик можно еще для гибкости прикрутить pycurl

0
 

Самый добрый бегемот

С нами с 24.06.03
Сообщения: 954
Рейтинг: 574

Ссылка на сообщениеДобавлено: 10/01/12 в 11:29       Ответить с цитатойцитата 

Протестировали оба решения.
Текущий способ с запуском нескольких копий wget работает на порядки быстрее.
Не устраивает в текущей схеме то, что при достаточно большой нагрузке сервер складывается тупо от большого кол-ва запущенных процессов, т.е. судя по ТОПу task около 6к, при этом idle около 20%, I|O wait - не более 2%, а время тратится именно на переключение между задачами =( Вот собственно отсюда и растет необходимость в запуске 1 процесса, который параллельно дернет несколько урлов.

0
 



С нами с 08.02.03
Сообщения: 10564
Рейтинг: 5962


Передовик Master-X (01.06.2018) Передовик Master-X (16.06.2019) Передовик Master-X (01.04.2020) Передовик Master-X (16.04.2020) Передовик Master-X (16.10.2021) Ветеран трепа Master-X (01.11.2021)
Ссылка на сообщениеДобавлено: 10/01/12 в 13:31       Ответить с цитатойцитата 

atrius: а винты у тя там какие и паралельно это скока (количество и какую полосу по mrtg грузят)?
И кусок топа покаж

0
 



С нами с 24.06.10
Сообщения: 2686
Рейтинг: 543

Ссылка на сообщениеДобавлено: 10/01/12 в 14:32       Ответить с цитатойцитата 

да дело не в винтах, на пыхе - ясен будет медленнее) в его случае, пока мультикурл полностью не отработает для текущего набора подзаданий, управление назад в скрипт он не вернёт, там "события" нужно эмулировать и самому всё дёргать, кроме того

А в случае Пайтона это происходит потому, как Global Lock JIT-а, что б его, но в целом, это один из тех немногих случаев, для которых нужна истинная true-многопоточность, и когда она действительно нужна, можно использовать multiprocessing, фактически, это тот же форк, но только не wget-а а самого себя. Ясен, всегда нужно синхронизироваться и т.д. но для этого случая, сойдёт и так (ну или просто queue, multiprocessing.Pool и т .д.)

это:
Код:

from threading import Thread

class Downloader(Thread):
    def __init__(self, url):
        Thread.__init__(self)


замени на:
Код:

from multiprocessing import Process

class Downloader(Process):
    def __init__(self, url):
        super(Downloader, self).__init__()


ну а вообще нужно свой событийный пул делать, и подкидывать новые задания, когда какое-то одно отработает

0
 



С нами с 21.02.11
Сообщения: 50
Рейтинг: 30

Ссылка на сообщениеДобавлено: 21/01/12 в 00:59       Ответить с цитатойцитата 

atrius писал:
Надо написать программку на С++, которая в параметрах запуска примет N-urlов, ПАРАЛЛЕЛЬНО их скачает, а контент каждого положит в файл с заданным именем и путем. Сейчас задача решается путем параллельного запуска N-wgetов, что очень плохо сказывается на произодительности.
Кто может сделать, пишите в аську 523709. Обсудим бюджет =)
P.S. должно компилиться и работать на x86 и x86_64. Все под линукс.


Сделаем, не проблема. Отписался на почту.

Mac, iOS (iPhone, iPad), Android, Win, Linux разработки. Большой опыт, отличный результат.

0
 



С нами с 06.02.12
Сообщения: 11
Рейтинг: 15

Ссылка на сообщениеДобавлено: 09/02/12 в 11:14       Ответить с цитатойцитата 

Могу сбацать на python, файлы будут скачиваться асинхронно, процесс будет *один*, тормозов не будет. Цена 100 баксов. Для работы нужен будет python и библиотека curl.
Контакт: webdatadigger@gmail.com

0
 



С нами с 31.05.10
Сообщения: 1991
Рейтинг: 487

Ссылка на сообщениеДобавлено: 09/02/12 в 13:08       Ответить с цитатойцитата 

я так понимаю что твоя задача - написать альтернативный даунлоадер с хорошей подержкой параллельности. Так почему бы не посмотреть в сторону готовых решений: aria2c (http://aria2.sourceforge.net/), axel (http://www.icewalkers.com/Linux/Software/515850/Axel.html, http://www.cyberciti.biz/tips/download-accelerator-for-linux-command-line-tools.html), Multiget.

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »