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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ну тут еще зависит от того как расположен на диске файл размером 3G, сильно ли фрагментирован. Может статься что кэш диска порвет асинхронное ио, как тузик грелку.
...
Рейтинг: 0 / 0
Задачка по Java
    #38087268
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде синхронность/асинхронность не связана с кэшем?
К тому же обычно для оракла отключают системный дисковый кэш, потому что у него свой собственный кэш.
...
Рейтинг: 0 / 0
Задачка по Java
    #38087271
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многодисковый RAID спасёт отца демократии.
...
Рейтинг: 0 / 0
Задачка по Java
    #38087274
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪВроде синхронность/асинхронность не связана с кэшем?
К тому же обычно для оракла отключают системный дисковый кэш, потому что у него свой собственный кэш.
Связана, но косвенно. Оракл хорош когда данные в разных таблицах раскиданы по всему диску. Если файл строго последовательный, то быстрее прямого доступа к диску ничего нет(в том числе и предсказание очередного доступа), поэтому и порвет, и если б все файлы были строго последовательные то и оракл не нужен был:)
...
Рейтинг: 0 / 0
Задачка по Java
    #38087280
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник и если б все файлы были строго последовательные то и оракл не нужен был:)
У оракла немного другое предназначение, нежели исправлять фрагментацию файловой системы :)
...
Рейтинг: 0 / 0
Задачка по Java
    #38087282
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли файл строго последовательный, то быстрее прямого доступа к диску ничего нет(в том числе и предсказание очередного доступа)

А что такое прямой доступ и предсказание очередного доступа? Как это по английски называется?
...
Рейтинг: 0 / 0
Задачка по Java
    #38087284
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВзабыл ник и если б все файлы были строго последовательные то и оракл не нужен был:)
У оракла немного другое предназначение, нежели исправлять фрагментацию файловой системы :)
Я не спорю - какая посылка, такой и ответ. Я рассматривал в разрезе задачи и сильно утрировал, надеюсь вам спокойнее?:)
...
Рейтинг: 0 / 0
Задачка по Java
    #38087295
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪавторЕсли файл строго последовательный, то быстрее прямого доступа к диску ничего нет(в том числе и предсказание очередного доступа)

А что такое прямой доступ и предсказание очередного доступа? Как это по английски называется?

Прямой доступ - это, извини, прямой доступ:) Оракл физически не может удержать все в оперативной памяти(ну точнее мб и может, все зависит от размера данных и размера оперативки), и рано или поздно ему придется с диском общаться. А предсказание считывания очередного доступа - это отсебятина естественно, имелся ввиду кэш дискового контроллера.
Нет ну если хочешь потроллить я не против)
...
Рейтинг: 0 / 0
Задачка по Java
    #38087447
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем сложность?
...
Рейтинг: 0 / 0
Задачка по Java
    #38087474
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЗадача состоит из:
- Чтения потокового файла — строго последовательный процесс.
- парсинга на слова
- похода к хэш-таблице за счетчиком слов.

Все строго последовательно, нет нигде провода параллелить.
Параллелить можно по разному, например сделать конвейер. Это уже даст 3 параллельных потока, согласно вашей схеме. Далее, можно иметь N хэш-таблиц и обслуживать каждую своим потоком. Или просто иметь несколько потоков для работы с хэш-таблицей, а в качестве таблицы взять ConcurrentHashmap. Да и парсинг можно распаралелить по блокам, только надо особо учитывать слова, попадающие на границы блоков.
...
Рейтинг: 0 / 0
Задачка по Java
    #38088528
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если речь о более-менее смысловом тексте, то основная проблема - кодировка и определение термина "слово".
Дальше вспоминаем, что полные словари русского/английского языков - десятки тысяч слов (50-70 тысяч), от души набрасываем двести процентов на специальную терминологию, множим на отбалдянскую сотню и получаем десятки мегабайт максимум .
Вспоминаем, что пропускная способность на многопоточных чтениях не падает только у твердотельных дисков и плавно подходим к выводу: последовательная вычитка с хранением в каком-нибудь дереве и будет не только самым простым, но и самым быстрым решением в подавляющем большинстве случаев .
...
Рейтинг: 0 / 0
Задачка по Java
    #38088748
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonidvalexgor123Есть большой текстовый файл (~3 ГБ). Требуется подсчитать количество вхождений каждого слова в файл с использованием threads. Не подскажите с чего начать? Сколько потоков нужно создавать?
Классическая задача на map/reduce. Начать с его изучения и реализации.

Проблема в том, что тут нет его, нет map reduce. На самом деле это не map reduce, а "разделяй и властвуй", но для начала как то надо разделить.
...
Рейтинг: 0 / 0
Задачка по Java
    #38088753
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfqMasterZivЗадача состоит из:
- Чтения потокового файла — строго последовательный процесс.
- парсинга на слова
- похода к хэш-таблице за счетчиком слов.

Все строго последовательно, нет нигде провода параллелить.
Параллелить можно по разному, например сделать конвейер. Это уже даст 3 параллельных потока, согласно вашей схеме. Далее, можно иметь N хэш-таблиц и обслуживать каждую своим потоком. Или просто иметь несколько потоков для работы с хэш-таблицей, а в качестве таблицы взять ConcurrentHashmap. Да и парсинг можно распаралелить по блокам, только надо особо учитывать слова, попадающие на границы блоков.

Согласия бы, если бы файл имел какую то неаморфную структуру.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачка по Java
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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