|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.11.2011, 07:08 | #1 |
Регистрация: 05.11.2011
Сообщений: 7
|
Как лучше работать с несколькими миллионами строк
Здравствуйте!
Простите, если вопрос совсем глупый. Но если не трудно, направьте в нужную сторону, пожалуйста. Итак, стоит передо мной задача (вообще, я админ) проанализировать журнал(лог) прокси сервера. При этом агрегировать похожие записи. Т.е. допустим, в течение дня Вася ходил на Яндекс 20 раз, на Гугл - 10, на третий сайт 15 итд. Мы в итоговый массив данных будем не каждую новую строчку заносить, а добавлять к уже существующей объем скачанного. Проблема в том, что Вась имеем несколько десятков тысяч, а строчек несколько десятков миллионов (в день). Алгоритм который работал на предыдущей работе тут не справляется Я делал многомерный массив, 5 (пользователь, сайт, байтысюда, байтытуда, времяобработки ) на 3.000.000 элементов. Потом построчно считываем файл журнала и на каждой строчке делаем проверку - если уже есть такой же пользователь+сайт, то добавляем к нему, если нет, заносим новый элемент. Работает это всё нестабильно. Если количество уникальных пар пользователь+сайт меньше 500 тысяч, всё летает. Но когда их становится миллион или 2.5млн, то обрабатывается всё по 8-10 часов. А это слишком медленно. Пробовал оптимизировать, но результат всё-равно не устраивает. Сначала перебор записей делал по циклу for от начала до конца, когда нашли запись, break. Потом поменял на Array.Indexof (для этого пришлось завести 4 массива, в одном одной строкой пользователь+сайт - по нему и ищет Array.Indexof, в остальных байты и время. Стало быстрее раз в 10, но всё-равно по нескольку часов думает. Дальше уже какие-то грязные хаки пошли - маленькие сайты я добавляю под именем other, но это уже попытки уменьшить размер конечного массива, а не оптимизация. Посоветуйте, пожалуйста, что ещё попробовать? Чтобы был быстрый поиск строки в массиве, но при этом и возможности менять строки. То есть stringbuilder не подходит (вроде). Dataset тоже умрет на таких объемах, по-моему, если сначала загрузить все несколько миллионов записей, а потом пытаться агрегировать. А если каждый раз select дергать, то, подозреваю, что тоже всё очень медленно будет. |
05.11.2011, 09:41 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Dictionary по ключу будет искать быстрее, чем Array.Indexof.
Для таких объемов не грех и СУБД простенькую какую-нибудь прикрутить |
05.11.2011, 12:42 | #3 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Раздели массив на массивы. Создай на каждую букву фамилии/ника юзеров свой массив. Если Ивановых будет все равно больше 500 000 разбей на несколько и их.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
05.11.2011, 15:58 | #4 |
Форумчанин
Регистрация: 25.09.2009
Сообщений: 525
|
можно использовать например SortedList (быстрый двоичный поиск)
ключом будет вася(или даже его хеш), а значением еще один словарь сайт-количество если я правильно понял то типа такого Код:
Последний раз редактировалось m0nax; 05.11.2011 в 16:06. |
06.11.2011, 11:47 | #5 |
Регистрация: 05.11.2011
Сообщений: 7
|
Большое спасибо! Как засунуть класс в словарь не осилил (точнее, как потом с ним работать), но даже переход на словарь из двух строк дал дикий прирост скорости - теперь даже самые большие файлы обрабатываются за несколько секунд.
Благодарю! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как вычислить кол-во пустых ячеек с несколькими условиями? | Ppaa | Microsoft Office Excel | 6 | 25.07.2011 13:34 |
С чем лучше работать? | EXMP | Свободное общение | 19 | 07.10.2010 11:15 |
Принтер будет работать лучше если узнает что его ждет в случае .. | HellMercenariess | Компьютерное железо | 3 | 09.11.2009 09:59 |
С какими файлами лучше работать? | blackstersl | Общие вопросы Delphi | 3 | 15.06.2009 15:12 |
Поиск файлов сразу с несколькими расширениями. Как??? | Altera | Общие вопросы Delphi | 20 | 28.03.2008 01:43 |