Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка по Java / 25 сообщений из 39, страница 1 из 2
20.12.2012, 11:37:20
    #38086408
alexgor123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Есть большой текстовый файл (~3 ГБ). Требуется подсчитать количество вхождений каждого слова в файл с использованием threads. Не подскажите с чего начать? Сколько потоков нужно создавать?
...
Рейтинг: 0 / 0
20.12.2012, 11:41:39
    #38086414
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
alexgor123Есть большой текстовый файл (~3 ГБ). Требуется подсчитать количество вхождений каждого слова в файл с использованием threads. Не подскажите с чего начать? Сколько потоков нужно создавать?
Как это обычно случается. Задача не описана польностью.
Потому что в такой постановке и одного потока достаточно.
Но ведь есть какие-то ещё требования, о которых вы умалчиваете. Например, чтобы парсинг укладывался по времени в сутки. Или часов 8.
Забавно, у нас недавно была похожая задача. Сам не делал, но знаю постановку и размышлял над тем как бы сделал я.
Правда у нас было 4Гб файл в zip архиве.
Итак. Каките требования ещё есть?
...
Рейтинг: 0 / 0
20.12.2012, 12:02:27
    #38086453
alexgor123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Blazkowicz,

Минимальные потери по времени (до 6 часов)
...
Рейтинг: 0 / 0
20.12.2012, 12:07:52
    #38086466
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Не подскажите с чего начать?

Забыть по слово threads при решении этой задачи.

Сколько потоков нужно создавать?

0
...
Рейтинг: 0 / 0
20.12.2012, 12:11:48
    #38086475
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Задача состоит из:
- Чтения потокового файла — строго последовательный процесс.
- парсинга на слова
- похода к хэш-таблице за счетчиком слов.

Все строго последовательно, нет нигде провода параллелить.
...
Рейтинг: 0 / 0
20.12.2012, 12:16:32
    #38086489
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Количество потоков должно быть таким, чтобы CPU был всё время загружен на 100%. Это вычисляется из количества ядер. И соотношении времени прстоя на IO операциях к времени обработки на CPU.

Самое главное в этой задаче это реализовать масштабируемость по потокам. Т.е. если задача на 2х ядрах обсчитывается 12 часов, то чтобы на 4х было 6, а на 8-ми - три, без переписывания проекта.
Таким образом, можно, например, арендовать в облаке ненадолго многоядерный сервер и обсчитать файл в кратчайшее время.

Второе на что стоит обратить внимание это масштабирумость на физические устройства. Т.е. почему бы не побить файл на два и не обсчитать отдельно на 2х компах? Если у вас, например, небольшая software команда, то запустив файл на 5-10 компах ночью, можно обсчитать его за пару часов и меньше. Потом объединить результаты. (читать про Map-Reduce)

Третье это минимизация IO как самой долгой операции. 3Гб это на столько мало, что на многих машинах можно полностью загрузить в RAM до обработки.

И только в последнюю очередь стоит уже посмотреть на эффективность поиска и подсчета отдельных слов. Даже если эта задача решена не оптимально, зачастую будет дешевле купить\арендовать второй комп, и обсчитать в 2 раза быстрее, чем оптимизировать код. Конечно здесь нужно быть внимательным, чтобы не убить перформанс на корню. Но и оптимизировать очень усилино, смысла нет, если оно нормально масштабируется.
...
Рейтинг: 0 / 0
20.12.2012, 12:46:47
    #38086564
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
BlazkowiczСамое главное в этой задаче это реализовать масштабируемость по потокам. Т.е. если задача на 2х ядрах обсчитывается 12 часов, то чтобы на 4х было 6, а на 8-ми - три, без переписывания проекта.
Таким образом, можно, например, арендовать в облаке ненадолго многоядерный сервер и обсчитать файл в кратчайшее время.
Даже в теории это невозможно ведь?
...
Рейтинг: 0 / 0
20.12.2012, 12:49:46
    #38086571
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
MasterZivЗадача состоит из:
- Чтения потокового файла — строго последовательный процесс.
- парсинга на слова
- похода к хэш-таблице за счетчиком слов.
Все строго последовательно, нет нигде провода параллелить.
Кстати да. Здесь обработка на столько простая что и решение в лоб может быть достаточно быстрым. У нас задача осложнялась тем что слова нельзя было выделить в тексте. Они не обособлены пробелами или знаками припинания.
...
Рейтинг: 0 / 0
20.12.2012, 12:53:55
    #38086576
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
BlazkowiczКстати да. Здесь обработка на столько простая что и решение в лоб может быть достаточно быстрым. У нас задача осложнялась тем что слова нельзя было выделить в тексте. Они не обособлены пробелами или знаками припинания.

А как тогда слова обозначались?

Ну и ты как бы модифицируешь исходную задачу.
...
Рейтинг: 0 / 0
20.12.2012, 12:57:03
    #38086582
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
ТимоНДаже в теории это невозможно ведь?
Почему? Если IO свести у нулю, а ядра загрузить независимыми задчами, то будет примерно так и масштабироваться.
А этой задаче ядрам никак не нужно обмениваться данными и работают они могут с независимыми участками памяти.
Конечно же будут потери на задачи ОС и т.п. Но в целом это к тому к чему можно стремиться в этой задаче.
...
Рейтинг: 0 / 0
20.12.2012, 12:58:40
    #38086587
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
MasterZivА как тогда слова обозначались?

Никак, их надо было ещё найти. У нас была задача поиска слов, а не статистики.

MasterZivНу и ты как бы модифицируешь исходную задачу.
Ну, да. Это я так. Лирическо отступление. У автора всё на много проще. Можно решить в лоб и потом тупо бить файл.
...
Рейтинг: 0 / 0
20.12.2012, 13:13:44
    #38086614
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
alexgor123Есть большой текстовый файл (~3 ГБ). Требуется подсчитать количество вхождений каждого слова в файл с использованием threads. Не подскажите с чего начать? Сколько потоков нужно создавать?
Классическая задача на map/reduce. Начать с его изучения и реализации.
...
Рейтинг: 0 / 0
20.12.2012, 13:16:50
    #38086619
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
LeonidvКлассическая задача на map/reduce. Начать с его изучения и реализации.
Не обязательно. Если ресурсов достаточно и процессинг не такой сложный, то можно Fork/Join обойтись:
http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html
...
Рейтинг: 0 / 0
20.12.2012, 13:37:42
    #38086661
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
alexgor123, слова можно аппроксимировать. К примеру прочитав 25% объёма файла
и узнать что в нём 300000 строк я могу до конца эксперимента сказать что
в конце будет примерно 300 000 * 4 = 1 200 000 слов. Это приблизительная
оценка и она уточняется тем точнее чем ближе курсор к концу файла.
В принипе в рамках данной постановки я не знаю зачем вообще нужно
счиать слова. Это глупо. Особенно если это не СSV база.
...
Рейтинг: 0 / 0
20.12.2012, 13:41:51
    #38086666
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
BlazkowiczПочему? Если IO свести у нулю, а ядра загрузить независимыми задчами, то будет примерно так и масштабироваться. А этой задаче ядрам никак не нужно обмениваться данными и работают они могут с независимыми участками памяти. Конечно же будут потери на задачи ОС и т.п. Но в целом это к тому к чему можно стремиться в этой задаче.
Закон Амдала
...
Рейтинг: 0 / 0
20.12.2012, 13:50:59
    #38086692
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
ТимоН Закон Амдала
Дык в указаной задаче ɑ стремится к единице:
1) Количество процессоров 4-8-16 достаточно мало, чтобы каждый из них независимо мог обрабатывать свой кусок входного файла.
2) Время обработки части файла несоизмеримо больше, чем суммирование результатов от каждого ядра. Пусть там даже словарь на 300К слов, выпонить 3М сложений это ничто на фоне чтения и сканирования 3Гб файла.
...
Рейтинг: 0 / 0
20.12.2012, 14:01:16
    #38086713
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
BlazkowiczДык в указаной задаче ɑ стремится к единице:
1) Количество процессоров 4-8-16 достаточно мало, чтобы каждый из них независимо мог обрабатывать свой кусок входного файла.
2) Время обработки части файла несоизмеримо больше, чем суммирование результатов от каждого ядра. Пусть там даже словарь на 300К слов, выпонить 3М сложений это ничто на фоне чтения и сканирования 3Гб файла.
Хотя да, наверно для этой задачи можно добиться такого прироста.
...
Рейтинг: 0 / 0
20.12.2012, 16:10:34
    #38087041
oneHalf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Я тут не совсем спец в этом, но может проще затянуть все в БД - все слова в один столбик одной таблицы, причем существуют спец. утилитки, (например для mssql - csv bulk insert) или использовать встраиваемые движки бд (derby, и т.д.) в программе. Тогда уже весь гемор по подсчету всяких вариаций всяких вхождений ляжет на плечи бд.
...
Рейтинг: 0 / 0
20.12.2012, 16:21:30
    #38087070
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
oneHalfЯ тут не совсем спец в этом, но может проще затянуть все в БД - все слова в один столбик одной таблицы, причем существуют спец. утилитки, (например для mssql - csv bulk insert) или использовать встраиваемые движки бд (derby, и т.д.) в программе. Тогда уже весь гемор по подсчету всяких вариаций всяких вхождений ляжет на плечи бд.
Можно делать кучу разных допущений и оптимизаций, если знать структуру входного файла. Но автор о ней умалчивает.
Но файл в 3Гб может содержать сотни миллионов слов. MySQL потом усрется count-ы считать по такой таблице.
Да и сам экспорт в базу с построением индексов может занять часы, если база не в памяти развернута.
Поэтому смысла особого нет, мне кажется.
Вариант описаный MasterZiv при нужном подходе может быть даже и в 6 часов уложится в один поток.
...
Рейтинг: 0 / 0
20.12.2012, 16:48:52
    #38087135
oneHalf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Ну я всё к тому клоню, что задача наверняка имеет готовое решение, воспользоваться которым может оказаться проще и надежнее. 10 сек. гугла дает Apache Lucene, наверняка есть еще куча всего. Короче, если бы предо мной встала такая задача не для души а по работе, я бы не изобретал хендмэйд велик.
...
Рейтинг: 0 / 0
20.12.2012, 17:07:14
    #38087168
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Тут слабым местом будет диск IMHO. По сути это вычитка файла.
...
Рейтинг: 0 / 0
20.12.2012, 17:22:55
    #38087192
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
maytonТут слабым местом будет диск IMHO. По сути это вычитка файла.
Нет не будет. Сколько занимает времени вычитать 3Гб c HDD? Скорость современных винтов от 30Мб\с (какая-нибудь зеленая модель на 5400RPM). Т.е. 100 секунд на чтение файла. :) В худшем случае это минуты, но не часы.
...
Рейтинг: 0 / 0
20.12.2012, 17:32:53
    #38087203
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Blazkowicz, эта скорость просядет нелинейно от числа читающих потоков.
Причем для чистоты эксперимента надо как-то перегрузить кеш файловой
системы. Иначе получим фейк.
...
Рейтинг: 0 / 0
20.12.2012, 17:37:25
    #38087212
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
maytonПричем для чистоты эксперимента надо как-то перегрузить кеш файловой
системы. Иначе получим фейк.
А тут никто и не предлагает читать файл со случайным доступом.
Либо весь в RAM загрузить, хоть даже и через виртуальный диск.
Либо читать линейно в один поток.
...
Рейтинг: 0 / 0
20.12.2012, 17:39:06
    #38087214
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по Java
Да пока в RAM будем грузить - уже решим задачу.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка по Java / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]