|
|
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
Есть большой текстовый файл (~3 ГБ). Требуется подсчитать количество вхождений каждого слова в файл с использованием threads. Не подскажите с чего начать? Сколько потоков нужно создавать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 11:37:20 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
alexgor123Есть большой текстовый файл (~3 ГБ). Требуется подсчитать количество вхождений каждого слова в файл с использованием threads. Не подскажите с чего начать? Сколько потоков нужно создавать? Как это обычно случается. Задача не описана польностью. Потому что в такой постановке и одного потока достаточно. Но ведь есть какие-то ещё требования, о которых вы умалчиваете. Например, чтобы парсинг укладывался по времени в сутки. Или часов 8. Забавно, у нас недавно была похожая задача. Сам не делал, но знаю постановку и размышлял над тем как бы сделал я. Правда у нас было 4Гб файл в zip архиве. Итак. Каките требования ещё есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 11:41:39 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Минимальные потери по времени (до 6 часов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:02:27 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
Не подскажите с чего начать? Забыть по слово threads при решении этой задачи. Сколько потоков нужно создавать? 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:07:52 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
Задача состоит из: - Чтения потокового файла — строго последовательный процесс. - парсинга на слова - похода к хэш-таблице за счетчиком слов. Все строго последовательно, нет нигде провода параллелить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:11:48 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
Количество потоков должно быть таким, чтобы CPU был всё время загружен на 100%. Это вычисляется из количества ядер. И соотношении времени прстоя на IO операциях к времени обработки на CPU. Самое главное в этой задаче это реализовать масштабируемость по потокам. Т.е. если задача на 2х ядрах обсчитывается 12 часов, то чтобы на 4х было 6, а на 8-ми - три, без переписывания проекта. Таким образом, можно, например, арендовать в облаке ненадолго многоядерный сервер и обсчитать файл в кратчайшее время. Второе на что стоит обратить внимание это масштабирумость на физические устройства. Т.е. почему бы не побить файл на два и не обсчитать отдельно на 2х компах? Если у вас, например, небольшая software команда, то запустив файл на 5-10 компах ночью, можно обсчитать его за пару часов и меньше. Потом объединить результаты. (читать про Map-Reduce) Третье это минимизация IO как самой долгой операции. 3Гб это на столько мало, что на многих машинах можно полностью загрузить в RAM до обработки. И только в последнюю очередь стоит уже посмотреть на эффективность поиска и подсчета отдельных слов. Даже если эта задача решена не оптимально, зачастую будет дешевле купить\арендовать второй комп, и обсчитать в 2 раза быстрее, чем оптимизировать код. Конечно здесь нужно быть внимательным, чтобы не убить перформанс на корню. Но и оптимизировать очень усилино, смысла нет, если оно нормально масштабируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:16:32 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
BlazkowiczСамое главное в этой задаче это реализовать масштабируемость по потокам. Т.е. если задача на 2х ядрах обсчитывается 12 часов, то чтобы на 4х было 6, а на 8-ми - три, без переписывания проекта. Таким образом, можно, например, арендовать в облаке ненадолго многоядерный сервер и обсчитать файл в кратчайшее время. Даже в теории это невозможно ведь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:46:47 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
MasterZivЗадача состоит из: - Чтения потокового файла — строго последовательный процесс. - парсинга на слова - похода к хэш-таблице за счетчиком слов. Все строго последовательно, нет нигде провода параллелить. Кстати да. Здесь обработка на столько простая что и решение в лоб может быть достаточно быстрым. У нас задача осложнялась тем что слова нельзя было выделить в тексте. Они не обособлены пробелами или знаками припинания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:49:46 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
BlazkowiczКстати да. Здесь обработка на столько простая что и решение в лоб может быть достаточно быстрым. У нас задача осложнялась тем что слова нельзя было выделить в тексте. Они не обособлены пробелами или знаками припинания. А как тогда слова обозначались? Ну и ты как бы модифицируешь исходную задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:53:55 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
ТимоНДаже в теории это невозможно ведь? Почему? Если IO свести у нулю, а ядра загрузить независимыми задчами, то будет примерно так и масштабироваться. А этой задаче ядрам никак не нужно обмениваться данными и работают они могут с независимыми участками памяти. Конечно же будут потери на задачи ОС и т.п. Но в целом это к тому к чему можно стремиться в этой задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:57:03 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
MasterZivА как тогда слова обозначались? Никак, их надо было ещё найти. У нас была задача поиска слов, а не статистики. MasterZivНу и ты как бы модифицируешь исходную задачу. Ну, да. Это я так. Лирическо отступление. У автора всё на много проще. Можно решить в лоб и потом тупо бить файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:58:40 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
alexgor123Есть большой текстовый файл (~3 ГБ). Требуется подсчитать количество вхождений каждого слова в файл с использованием threads. Не подскажите с чего начать? Сколько потоков нужно создавать? Классическая задача на map/reduce. Начать с его изучения и реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 13:13:44 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
LeonidvКлассическая задача на map/reduce. Начать с его изучения и реализации. Не обязательно. Если ресурсов достаточно и процессинг не такой сложный, то можно Fork/Join обойтись: http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 13:16:50 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
alexgor123, слова можно аппроксимировать. К примеру прочитав 25% объёма файла и узнать что в нём 300000 строк я могу до конца эксперимента сказать что в конце будет примерно 300 000 * 4 = 1 200 000 слов. Это приблизительная оценка и она уточняется тем точнее чем ближе курсор к концу файла. В принипе в рамках данной постановки я не знаю зачем вообще нужно счиать слова. Это глупо. Особенно если это не СSV база. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 13:37:42 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПочему? Если IO свести у нулю, а ядра загрузить независимыми задчами, то будет примерно так и масштабироваться. А этой задаче ядрам никак не нужно обмениваться данными и работают они могут с независимыми участками памяти. Конечно же будут потери на задачи ОС и т.п. Но в целом это к тому к чему можно стремиться в этой задаче. Закон Амдала ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 13:41:51 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
ТимоН Закон Амдала Дык в указаной задаче ɑ стремится к единице: 1) Количество процессоров 4-8-16 достаточно мало, чтобы каждый из них независимо мог обрабатывать свой кусок входного файла. 2) Время обработки части файла несоизмеримо больше, чем суммирование результатов от каждого ядра. Пусть там даже словарь на 300К слов, выпонить 3М сложений это ничто на фоне чтения и сканирования 3Гб файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 13:50:59 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДык в указаной задаче ɑ стремится к единице: 1) Количество процессоров 4-8-16 достаточно мало, чтобы каждый из них независимо мог обрабатывать свой кусок входного файла. 2) Время обработки части файла несоизмеримо больше, чем суммирование результатов от каждого ядра. Пусть там даже словарь на 300К слов, выпонить 3М сложений это ничто на фоне чтения и сканирования 3Гб файла. Хотя да, наверно для этой задачи можно добиться такого прироста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 14:01:16 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
Я тут не совсем спец в этом, но может проще затянуть все в БД - все слова в один столбик одной таблицы, причем существуют спец. утилитки, (например для mssql - csv bulk insert) или использовать встраиваемые движки бд (derby, и т.д.) в программе. Тогда уже весь гемор по подсчету всяких вариаций всяких вхождений ляжет на плечи бд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 16:10:34 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
oneHalfЯ тут не совсем спец в этом, но может проще затянуть все в БД - все слова в один столбик одной таблицы, причем существуют спец. утилитки, (например для mssql - csv bulk insert) или использовать встраиваемые движки бд (derby, и т.д.) в программе. Тогда уже весь гемор по подсчету всяких вариаций всяких вхождений ляжет на плечи бд. Можно делать кучу разных допущений и оптимизаций, если знать структуру входного файла. Но автор о ней умалчивает. Но файл в 3Гб может содержать сотни миллионов слов. MySQL потом усрется count-ы считать по такой таблице. Да и сам экспорт в базу с построением индексов может занять часы, если база не в памяти развернута. Поэтому смысла особого нет, мне кажется. Вариант описаный MasterZiv при нужном подходе может быть даже и в 6 часов уложится в один поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 16:21:30 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
Ну я всё к тому клоню, что задача наверняка имеет готовое решение, воспользоваться которым может оказаться проще и надежнее. 10 сек. гугла дает Apache Lucene, наверняка есть еще куча всего. Короче, если бы предо мной встала такая задача не для души а по работе, я бы не изобретал хендмэйд велик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 16:48:52 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
Тут слабым местом будет диск IMHO. По сути это вычитка файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 17:07:14 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
maytonТут слабым местом будет диск IMHO. По сути это вычитка файла. Нет не будет. Сколько занимает времени вычитать 3Гб c HDD? Скорость современных винтов от 30Мб\с (какая-нибудь зеленая модель на 5400RPM). Т.е. 100 секунд на чтение файла. :) В худшем случае это минуты, но не часы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 17:22:55 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, эта скорость просядет нелинейно от числа читающих потоков. Причем для чистоты эксперимента надо как-то перегрузить кеш файловой системы. Иначе получим фейк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 17:32:53 |
|
||
|
Задачка по Java
|
|||
|---|---|---|---|
|
#18+
maytonПричем для чистоты эксперимента надо как-то перегрузить кеш файловой системы. Иначе получим фейк. А тут никто и не предлагает читать файл со случайным доступом. Либо весь в RAM загрузить, хоть даже и через виртуальный диск. Либо читать линейно в один поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 17:37:25 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38086692&tid=2130317]: |
0ms |
get settings: |
17ms |
get forum list: |
24ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
56ms |
get topic data: |
17ms |
get forum data: |
5ms |
get page messages: |
74ms |
get tp. blocked users: |
3ms |
| others: | 350ms |
| total: | 558ms |

| 0 / 0 |
