![]() |
|
|
![]()
|
|
| RayR |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 23.5.2007 Репутация: нет Всего: нет |
Ситуация такая: есть текстовый файл размером ~ 150 MB (логфайл с прокси сервера). Его нужно разбить на элементы, и эти элементы занести в БД (MSSQL8.1). Эта задача у меня без проблем была реализована на PHP5. Я брал данные из файла, разбивал их по определенному признаку командой "Explode" и заносил в БД(MSSQL8.1). На обработку такого файла уходило примерно 15-20 минут.
Появилась необходимость сделать это на С++, для локального использования. В С++Bulder6.0 я такой комманды не нашел и пришлось пользоваться этим: stringReplace (беру весь текст, по ключевому признаку делаю замену текста на символ перехода строки и заношу это в массив. В результате получается массив с примерно миллионом строк.). Все вроде нормально работает, но только если размер файла не превышает 25-30 метров. Если больше, то время выполнения задачи растет со страшной скоростью. Файл в 50 метров не смог развернуться за четыре часа, и это при том, что процессор был загружен на 100%. Причем до операции передачи данных в БД не доходит дела вообще, т.е. он затыкается на этапе разбения файла на куски. Оперативки на компе 2 гига, проц - Pentium4 3000 MHz. При выполнении задачи использование опреативки и файла подкачки подскакивает до ~50 %, проц - 100%. Что посоветуете, знатоки, как решить эту проблему? Заранее благодарен. |
|||
|
||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 3 Всего: 23 |
RayR, признак деления на строки это символ или подстрока?
Если первое то посмотри TStringList и его свойства СommaText, DelimitedText, Delimiter, QuoteChar А если второе, то можно создать невидимый TMemo или TRichEdit и воспользоватся TReplaceDialog. Возникнут непонятки с реализацией - спрашивай. Да, ещё как быстро они работают я не знаю. И ещё один вопрос - строки одинаковой длины (понимаю наивно, но всё же) P.S. сильно не критиковать - пишу на скорую руку с головы |
|||
|
||||
| HappyLife |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: нет Всего: 8 |
А как насчет оптимизации?.
Не читай весь файл. Читай его кусками и обрабатывай. После того как прочел нужную часть для одной строки БД, заноси. Затирай её и читай следующий кусочек. |
|||
|
||||
| RayR |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 23.5.2007 Репутация: нет Всего: нет |
Признак деления - это строка(ip-адрес, первые две триады): "192.168." |
|||
|
||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 3 Всего: 23 |
ну тогда наверно, через реплейс диалог.
Попроси модераторов перенести тему в C++Builder - бистрее поможем |
|||
|
||||
| RayR |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 23.5.2007 Репутация: нет Всего: нет |
С этого момента, пожалуйста, поподробней! Если не трудно, то простой пример, или список функций, с помощью которых это можно сделать. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: нет Всего: 158 |
какой ReplaceDialog?! какие затирания?!
просто построчно читать лог, парсить строку и добавлять в БД. если лог обновляется во время обработки, то тупо сделать "маркер" обработанного... fopen/fread, strchr/strstr/... либо аналоги. Добавлено через 3 минуты и 28 секунд практически все время в таком раскладе будет уходить на инсерты в бд... |
|||
|
||||
| RayR |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 23.5.2007 Репутация: нет Всего: нет |
Dumb, если не сложно, небольшой примерчик С указанными функциями ранее не сталкивался (такова специфика, работаю в основном с БД и математикой). Вот кусок лога: 1179253584.808 279 ip-адрес TCP_MISS/200 1739 GET http/://avt.foto.mail.ru/list/kapr/_avatarsmall имя_пользователя DIRECT/194.67.23.206 image/jpeg 1179253584.857 271 ip-адрес TCP_MISS/200 1667 GET http/://avt.foto.mail.ru/mail/abc44/_avatarsmall имя_пользователя DIRECT/194.67.23.13 image/jpeg 1179253584.880 5 ip-адрес TCP_MEM_HIT/200 1641 GET http/://avt.foto.mail.ru/mail/p.s.a/_avatarsmall имя_пользователя NONE/- image/jpeg 1179253584.978 260 ip-адрес TCP_MISS/200 1577 GET http/://avt.foto.mail.ru/mail/romul-avgustul/_avatarsmall имя_пользователя DIRECT/194.67.23.206 image/jpeg 1179253585.004 237 ip-адрес TCP_MISS/200 1015 GET http://status.mail.ru/? имя_пользователя DIRECT/194.67.23.104 image/gif Нужно выделить IP и размер запроса (число перед ip.). Это сообщение отредактировал(а) RayR - 24.5.2007, 12:00 |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: нет Всего: 158 |
функция sscanf не самая быстрая, не самая безопасная, но для короткого примера - сойдет...
размер запроса в другом месте, а это время обработки... |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 2 Всего: 44 |
я обычно для такого дела использую boost::regexp
|
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: нет Всего: 158 |
||||
|
||||
| RayR |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 23.5.2007 Репутация: нет Всего: нет |
Большое спасибо за помощь!!
Все получилось. Скорость обработки данных просто потрясающая - файл размером 180 метров "перекручивается за 2-3 минуты". |
|||
|
||||
![]()
|
| Правила форума "C++: Базы данных" | |
|
|
Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах. Благодарим за понимание. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Базы данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |