![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
CSharpProgrammer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.7.2006 Репутация: нет Всего: нет |
Доброго времени суток.
Задача такая, многопоточная закачка файлов из интернета (один пото - один файл). Так вот собственно интересует как можно проверить максимальное кол-во потоков (соединений), которое можно установить не в ущерб производительности? |
|||
|
||||
Vasay |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2097 Регистрация: 8.3.2006 Репутация: 3 Всего: 73 |
Понятие "ущерб производительности" весьма размыто. Максимально допустимое число открытых соединений зависит от настроек ОС. Было время, писал я всякие парсеры на Java. Обычно делал 300-600 потоков в зависимости от характеристик сервера. п.с. если выкачиваете текст, имейте ввиду, что stringBuilder рулит ![]() Это сообщение отредактировал(а) Vasay - 21.6.2012, 01:33 -------------------- Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны. |
|||
|
||||
CSharpProgrammer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.7.2006 Репутация: нет Всего: нет |
Vasay,
Спасибо. Под понятием "ущерб производительности" я имел ввиду тот придел до которго увеличение потоков будет приводить к увеличению скорости работы парсера. Т.е. как я понял все упирается в настройки ОС и ширину канала? |
|||
|
||||
Vasay |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2097 Регистрация: 8.3.2006 Репутация: 3 Всего: 73 |
И в то, что Вы делаете внутри потока. Я не просто так написал про "+" и stringBuilder ![]() -------------------- Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны. |
|||
|
||||
CSharpProgrammer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.7.2006 Репутация: нет Всего: нет |
||||
|
||||
Vasay |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2097 Регистрация: 8.3.2006 Репутация: 3 Всего: 73 |
Выложить исходники я не могу, но готов ответить на конкретные вопросы. -------------------- Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны. |
|||
|
||||
CSharpProgrammer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.7.2006 Репутация: нет Всего: нет |
Основной вопрос это как организована работа потоков в таком приложении (т.е. как правильно организовать). К примеру на входе 100К ссылок. В данный момент у меня реализована следующая архитектура
И каждый поток берет у Producer свою порцию данных. Так правильно? И какие варианты еще есть? |
|||
|
||||
Vasay |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2097 Регистрация: 8.3.2006 Репутация: 3 Всего: 73 |
Когда я начинал писать парсерный движок, ThreadPoolExecutor вроде еще не было (или я просто о нем знал на тот момент ![]() Потому делалось просто: из основного потока запускалось нужное количество потоков, потом основной поток в бесконечном цикле крутился, пока жив хотя бы один дочерний поток. Потоки за новыми данными обращались к synchronized методу. Сохранение данных шло разными путями, в зависимости от того, чего хотел добиться. В самом нагруженном случае, каждый поток обрабатывал данные, и результат обработки сохранялся (дописывал) в файл через synchronized метод использовавший единый для всех потоков BufferedWriter. Формат файла был предназначен для быстрой загрузки в базу с помощью LOAD DATA INFILE - это был самый быстрый способ загрузить данные в MySQL с построением индексов (нужен был быстрый поиск по текстовым полям в таблицах со 100мл записей). Не уверен что это оптимальный вариант (тем более на сегодняшний день) Но это работало и работало быстро. 100 мегабитный канал сервера забивал. Это сообщение отредактировал(а) Vasay - 21.6.2012, 03:40 -------------------- Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны. |
|||
|
||||
CSharpProgrammer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.7.2006 Репутация: нет Всего: нет |
Vasay,
Спасибо за развернутый ответ. Тему можно закрывать. |
|||
|
||||
Flashed |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 3.6.2010 Репутация: нет Всего: 1 |
Вообще, чтобы не завалить ОС,нужно использовать пул потоков. Сегодня защитил диплом на эту тему!!!
Вот отличная статья: http://www.ibm.com/developerworks/ru/library/j-jtp0730/ |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |