|
|
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток) Суть вопроса думаю понятна из заголовка. файл .csv содержит строки типа 1455812018,user2, http://ru.wikipedia.org,100 1455812019,user10, http://hh.ru,30 1455812968,user3, http://google.com,60 1455812411,user10, http://hh.ru,90 1455812684,user3, http://vk.com,50 1455839970,user1, http://ru.wikipedia.org,70 нужно распарсить по запятой и записать в другой .csv файл вот таким образом 18-FEB-2016 user2, https://ru.wikipedia.org,100 user3, http://google.com,60 user3, http://vk.com,50 user10, http://hh.ru,60 19-FEB-2016 user1, http://ru.wikipedia.org,70 из первоначальных строк предлагается получить поля класса(date, userID, URL, time). Я пока что сделал преобразование даты и имею сортированную по userID коллекцию объектов с 4мя стринговыми полями Содержимое выглядит так 19-фев-2016 user1 http://ru.wikipedia.org 70 18-фев-2016 user2 http://ru.wikipedia.org 100 18-фев-2016 user3 http://google.com 60 18-фев-2016 user3 http://vk.com 50 18-фев-2016 user10 http://hh.ru 30 18-фев-2016 user10 http://hh.ru 90 В случае если userID и URL совпадают, то необходимо посчитать среднее арифметическое(avg) из значений time и записать только 1 объект, содержащий avg. Также в выходном файле объекты должны быть сортированы по userID. Если значение "date" в объектах совпадает то делается только 1 запись для этой даты а затем помещаются значения полей для всех объектов, учитывая вышеописанные условия, пока date не получит новое значение. Затем для всех действий есть такое условие: папка с .csv файлами мониторится на наличие новых файлов. Одновременно в потоках могут обрабатываться до 10 файлов(1 файл = 1поток)(макс. 10 потоков), а остальные файлы должны быть помещены в очередь и начинать обрабатываться первым из освободившихся потоков. Подскажите с чего начать и в какой последовательности выполнять условия? Мои попытки пока не увенчались успехами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 12:04 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Нафига? CSV крайне простой формат, что бы городить многопоточность. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 12:09 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archelite, Замах на целый многопоточный парсер, а по факту однопоточный. Многопоточный парсер парсит один файл в несколько потоков. Тут у вас тупо запуск однопоточного парсера много раз с раздельными ресурсами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 12:09 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archelite, ИХМО, проще загрузить всё в какую-нибудь СУБД (многие умеют загружать данные из CSV файлов) и написать правильный SELECT по этим данным. А может быть вообще Excel? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 12:26 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Если задача парсить логи и они большие, то СУБД может и не справиться за разумное время. AFAIK. Проще ручками и значительно быстрее (по ресурсам в сотни, тысячи раз). Только проблемы в производительно совсем не те, что вынесены в заголовок темы. Ну и с учетом, что автор темы думает в концепции ООП ("из первоначальных строк предлагается получить класса", "имею сортированную по userID коллекцию объектов") подозреваю, что на большом массиве входных данных будут проблемы с памятью. Если нужно обрабатывать гигобайты логов - то думать нужно в другом направлении, если единицы мегабайт - то проблема производительности не встает, многопоточность даром не нужна (только лишние ошибки). IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 12:32 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Задание состоит именно в парсинге .csv и именно с применением потоков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 12:34 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevЕсли задача парсить логи и они большие, то СУБД может и не справиться за разумное время. AFAIK. Проще ручками и значительно быстрее (по ресурсам в сотни, тысячи раз). Только проблемы в производительно совсем не те, что вынесены в заголовок темы. Ну и с учетом, что автор темы думает в концепции ООП ("из первоначальных строк предлагается получить класса", "имею сортированную по userID коллекцию объектов") подозреваю, что на большом массиве входных данных будут проблемы с памятью. Если нужно обрабатывать гигобайты логов - то думать нужно в другом направлении, если единицы мегабайт - то проблема производительности не встает, многопоточность даром не нужна (только лишние ошибки). IMHO это тестовое задание, я бы и сам переработал структуру выходных данных, так чтобы не ломать голову целый день. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 12:36 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Нафига? Или это студенческое задание на применение потоков. Тогда: 1. Тема плохо названа. Т.к. BlazkowiczЗамах на целый многопоточный парсер, а по факту однопоточный. Многопоточный парсер парсит один файл в несколько потоков. Тут у вас тупо запуск однопоточного парсера много раз с раздельными ресурсами. 2. http://www.sql.ru/forum/941371/studentam-zhelaushhim-pomoshhi ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 12:38 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Спасибо, это не студенческое задание) здесь главное алгоритм парсинга, с потоками проблем возникнуть не должно, я знаю как это сделать в принципе. У меня есть несколько идей. Сначала в цикле можно вытаскивать поле time и складывать его значение со следующим, в случае если соблюдается условие userID && URL == next userID && URL. Затем создать объект с новым значением time, удалить из коллекции предыдущие объекты с совпадающими значениями и записать новый. Затем сортировать по дате, а потом уже что-то придумывать с датой Сейчас как раз мучаюсь с попыткой получения среднего времени, подскажите как правильно сделать счетчик объектов, которые удовлетворяют условию userID && URL == next userID && URL ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 12:57 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archelite, мне лично вообще не понятно, с чем Вы боретесь. Если я правильно представляю задачу, она сводиться к группировке (по дате) + последующей сортировке (по пользователю). Первое стандартный HashMap, второе просто стандартный sort. Это если все хранить в оперативной памяти. Если памяти хватает - ну и ладно. Если есть проблемы, тогда нужно будет изгаляться Дынные в единицы/десятки мегабайт проблем вызывать не должны, а в гигабайты уже наверное можно придумать какой-то более сложный алгоритм. Например процесс разбить на две части. Для каждой даты (даже если 365 дней в году - это не так и много) просто открыть временный файл (+ большой буфер ввода вывода в несколько мегабайт) и писать туда промежуточные данные. Потом вторым проходом отсортировать полученные файлы. Можно пойти дальше, для каждой даты несколько небольших отсортированных файлов (единицы/десятки Mb), результат сортировать слиянием. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 13:18 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archelite, смотри. Мультипоточность тебе тут толком не поможет. Потому что узкое место в этой задаче - последовательное чтение файла. Если ты свой ноут нагрузишь 10/100/1000 потоков CSV парсеров то это не даст производительности. Мне эта задачка очень напоминает учебные примеры Hadoop/BigData. Там берется csv файл (обычно в терабайт чтоб мало не показалось) режется на куски (пофиг какого размера можно даже разного) и кидается в специальное дисковое хранилище (по архитектуре похоже на RAID5 но суть другая) и дальше ты пишешь логику которая делает отображение и свёртку. Эту логику деплоишь в хадуп-кластер и она сама находит кусочки файлов и сворачивает и публикует резалт. Дисковая нагрузка - средняя из за того что псевдо-случайные потоки получают псевдо-случайный доступ к порциям твоего CSV файла (а также к его зеркальным копиям). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 13:26 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archeliteздесь главное алгоритм парсинга, с потоками проблем возникнуть не должно, я знаю как это сделать в принципе. Тут почти нет конкурентной многопоточности. Каждый поток читает свой файл. Обрабатывает свои данные и складывает их в БД, которая вполне себе разруливает транзакции. Так? Единственно что, если вас заботит производительность, то надо учитывать, что если разные потоки пытаются вычитать много разных файлов одновременно, это сильно снижает производительность на дисковых устройствах по сравнению с последовательным чтением одного файла. И еще у вас проблема с идентификацией парсинга. Парсинг это вычитать 3 значения из строки файла в 3 переменных в памяти. И так для всех строк. На этом парсинг зананчивается. Остальное, это уже обработка данных и бизнес-логика вашего приложения. К парсингу это отношения не имеет. Поэтому я бы на вашем месте выкинул из задачи слова про потоки и парсинг и сконцентрировался на проблемах с обработкой данных. В чем именно проблема - не понятно. Вы просто расписали как должно быть. Но почему это вызывает затруденения не объяснили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 13:44 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
etl какой нить. только логику настроить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 13:49 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
llemingetl какой нить. только логику настроить Какой? В лесу мышей все обижали. Они совершенно не представляли, что с этим делать, пока не решили пойти за советом к Сове как к самому мудрому члену их лесного сообщества. Сова была отзывчива и, немного подумав, сказала: «Вам нужно стать ежиками». «Гениально! – закричали мыши. – Но как же мы ими станем?» «Не знаю, – ответила Сова, – я – стратегический консультант»... Стратегический консалтинг – серьезно и не очень http://old.e-xecutive.ru/friday/article_3979/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 13:54 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevllemingetl какой нить. только логику настроить Какой? Kettle же. Другой за бесплатно еще пойди поищи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 13:56 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Вы просто расписали как должно быть. Но почему это вызывает затруденения не объяснили. Я еще не очень хорошо разбираюсь в Java) Начнем по порядку Выше мне подсказали использовать HashMap, я создал HashMap<String, String> в качестве ключа в цикле помещаю, значение date, а в качестве значения конкатенирую строки со значениями остальных полей. Получился map который содержит 2 пары, но только часть данных в значении. Пожалуй проще будет, если выложу код Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 14:15 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Во вложении готовый проект kettle взять здесь http://community.pentaho.com/projects/data-integration/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 14:16 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archeliteздесь главное алгоритм парсинга, с потоками проблем возникнуть не должно А с парсингом-то какие проблемы? Читаешь строку, выделяешь первое поле, скидываешь в очередь соответствующему потоку, который уже и выполняет остальной парсинг и запись в нужный файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 14:18 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
там правда чуть чуть поменять надо чтобы наименования файлов как нужно было и кавычки в csv там же можно настроить а вот sort я забыл добавить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 14:26 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archeliteВыше мне подсказали использовать HashMap, я создал HashMap<String, String>... Я бы делал как-то так: 1. Создаешь класс под данные Код: sql 1. 2. 3. 4. 5. 2. создаешь HashMap: Код: sql 1. 3. читаешь входные данные и одновременно группируешь по дням Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Данные по датам сгруппированы, уже хорошо. 4. Выводишь данные в порядке userId Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 14:31 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archeliteЯ еще не очень хорошо разбираюсь в Java) А Java тут не при чем. Вам нужен алгоритм решения вашей проблемы. Язык и платформа реализации вторичны. archeliteНачнем по порядку Выше мне подсказали использовать HashMap, я создал HashMap<String, String> в качестве ключа в цикле помещаю, значение date, а в качестве значения конкатенирую строки со значениями остальных полей. Получился map который содержит 2 пары, но только часть данных в значении. Пожалуй проще будет, если выложу код Разделите три подзадачи в разные реализации. 1) Мониторить каталог и запускать обработку 2) Парсить CSV в объекты 3) Обрабатывать объекты 4) Экспортировать объекты в нужный формат Не нужно делать один класс, который реализует все. Это будет "золотой молоток". Для CSV есть очень клевый парсер Apache Commons CSV https://commons.apache.org/proper/commons-csv/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 14:32 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archeliteВ случае если userID и URL совпадают, то необходимо посчитать среднее арифметическое(avg) из значений time и записать только 1 объект, содержащий avg. Также в выходном файле объекты должны быть сортированы по userID. Если значение "date" в объектах совпадает то делается только 1 запись для этой даты а затем помещаются значения полей для всех объектов, учитывая вышеописанные условия, пока date не получит новое значение. Есть куча стандартных терминов. У вас же вместо них какие-то витьеватные инсинуации формулировки. "Сгруппировать записи по пользователю". "Агрегировать среднеарифметическое по дате". Так что ли? Это все реализовано, хоть в SQL, хоть в Java Stream API. Не обязательно самому корячиться на hashmap ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 14:34 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archeliteЯ еще не очень хорошо разбираюсь в Java) Отложи лучше многопоточность. Вообще забудь. Любая даже самая простая мультипоточность - завалит тебя на сдаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 14:57 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. а как же время? должно быть еще поле Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. авторРазделите три подзадачи в разные реализации. 1) Мониторить каталог и запускать обработку 2) Парсить CSV в объекты 3) Обрабатывать объекты 4) Экспортировать объекты в нужный формат Примерно так и хотел сделать, только для каждого пункта не классы а методы. авторЕсть куча стандартных терминов. У вас же вместо них какие-то витьеватные инсинуации формулировки. "Сгруппировать записи по пользователю". "Агрегировать среднеарифметическое по дате". Так что ли? Это все реализовано, хоть в SQL, хоть в Java Stream API. Не обязательно самому корячиться на hashmap Да всё так, но у меня тестовое задание перед собеседованием, которое нужно написать именно на Java, так что придется корячиться) Посмотрел про Java Stream API, должно быть классная штука, только совершенно незнакомая) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 15:05 |
|
||
|
Многопоточный .csv парсер
|
|||
|---|---|---|---|
|
#18+
archeliteа как же время? должно быть еще поле А так же валидация и типизация. Вас что удерживает от того чтобы добавить 4е поле в класс? Код: java 1. Это псевдо-код чтобы показать идею. archeliteПримерно так и хотел сделать, только для каждого пункта не классы а методы. Будет процедурное программирование. Работодатель не оценит. archeliteДа всё так, но у меня тестовое задание перед собеседованием, которое нужно написать именно на Java, так что придется корячиться) Так я о терминологии. В задании тоже не слова нет о группировках и агрегациях? archeliteПосмотрел про Java Stream API, должно быть классная штука, только совершенно незнакомая) Ах, что же делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2016, 15:28 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39215473&tid=2124156]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
89ms |
get topic data: |
16ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 481ms |

| 0 / 0 |
