|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.08.2008, 11:05 | #1 |
Регистрация: 07.08.2008
Сообщений: 5
|
Загрузка и поиск в большом файле.
Доброго времени всем!
Есть очень большой логфайл (текстовый) ~3 Гб (может быть меньше или больше) в котором надо найти строки с теми данными которые необходимы. Программу сделал и даже ищет :-), НО только в файлах которые измеряются в Кб т.е. в маленьких файликах. Это уже хорошо, но нужно в огромных файлах. Программа даже не грузит такой файл и это понятно, думаю что надо использовать поток (), но опыт в их использовании нуль, читал (примеров правда оч. мало) но как прикрутить не совсем понимаю. Прошу помоши. Ниже программа (если возникнут вопросы), немного обрезанная (Close, Save и т.д.), для уменьшения объёма: Спасибо. *********************************** ********************* Код:
Последний раз редактировалось Stilet; 07.08.2008 в 12:37. |
07.08.2008, 13:38 | #2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Алексей_M, один вопрос Вам - текст для поиска (в Вашем примере "ISO") может быть на двух разных строчках? (т.е. часть, например I в конце одной строки, а SO в начале другой?? Если это не так, то поиск делайте так:
Код:
|
07.08.2008, 13:53 | #3 |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
MyFileTS.LoadFromFile
очень очень ОЧЕНЬ плохо для 3Гб-файла!! Лучше использовать TFileStream и алгоритм Бойера-Мура (он ищет строку по начальному и конечному символу, очень быстро отьрасывая весь мусор. Комптех рулит ). Когда-то контрольную на подобную тему делал, попробую найти
пыщь
|
07.08.2008, 13:57 | #4 |
Участник клуба
Регистрация: 03.05.2007
Сообщений: 1,189
|
В любом случае нужно как-то уменьшть размер файла, ты об этом не думал. Напиши что в нем такое лежит, если не секрет, т.к. я бы н е хотел чтобы у меня лог был 3 гига. Волзможно есть другой подход.
|
07.08.2008, 14:50 | #5 |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
В 1.4Гб-файле нашёл строку в конце ~за 80 секунд (WinHEX - около минуты), скопипастил с http://articles.org.ru/cn/showdetail.php?cid=6427
Сам поиск лучше запихать в отдельный thread, когда found=true вызывать процедуру, приостанавливающую его и выводящую запрос "искать далее, да/нет", если да - установить found=false и запустить поток дальше, если нет - tfilestream.free и прибить thread. Но это уж вы как нибудь сами * кстати да, что это за лог такой на 3 гига, если не секрет?
пыщь
Последний раз редактировалось JTG; 07.08.2008 в 14:53. |
07.08.2008, 16:54 | #6 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
JTG - Вы всё пишете абсолютно правильно.
за одним малюсеньким уточнением. Пару лет назад я озаботился, как поэффективнее работать с текстовыми файлами. Так вот, тот вариант, что Вы предложили - самый быстрый. но! Внимание! я Вас очень прошу - попробуйте код, который я привёл в своем посте #2. и на Вашем файле (который 1.4 ГБ) найти ту же информацию, что Вы искали... И замерить время... я думаю, что оно будет больше, может даже в разы.. но не настолько плохо, как Readln(...) $))) Жду результатов. |
07.08.2008, 19:12 | #7 |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
На том же файле не могу, он бинарный, в смысле фильм
Вот сейчас сохранится аналогичный текстовый, его и попробую загрузить -- Ну, скажем так, я не удивлён First chance exception at $7C812A23. Exception class EOutOfMemory with message 'Out of memory'. Process Project1.exe (1216) на MyFileTS.LoadFromFile Не влезет туда такой объем информации, он же наверняка весь сразу грузится
пыщь
Последний раз редактировалось JTG; 07.08.2008 в 19:32. |
07.08.2008, 20:55 | #8 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,551
|
Я не уверен, но вроде в TStringList есть ограничение на количество строк: 65535. Опять же, возможно это у меня из старой памяти, когда писали под Win 3.11 на Делфи 1, но там это точно было.
E-Mail: arigato.freelance@gmail.com
|
08.08.2008, 00:30 | #9 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Уважаемый JTG. Приношу персонально Вам (а также, разумеется, автору вопроса и всем участникам дискуссии) свои глубочайшие извинения. я был неправ. Тут же речь идёт не о больших текстовых файлах, тут речь о ГИГАНТСКИХ текстовых файлах! А мне почему-то втемяшилось в голову, что речь идёт о мегабайтных файлах..
Нет, для гиговых файлов TStringList категорически не подходит (его поле деятельности файлы на десятки МБ, максимум - несколько сотен МБ, но не больше!!!) Вот, попробовал, создал текстовый файл на 1 ГБ (20000 строк) - LoadFromFile грузила его около пяти минут ;-(( Да и вообще, большие файлы нельзя целиком грузить в память - это смерти подобно... Цитата:
Код:
|
|
08.08.2008, 16:40 | #10 |
Регистрация: 07.08.2008
Сообщений: 5
|
Доброго времени!
Serge_Bliznykov: ISO-Начало строки, конец строки это любой символ. Все идёт по строчно и не режется. Пр. ISO123jtgh56fh<7880>u90............ ... ISO9765ggsjgdjjtr-=>>899............... и т.д. Смысл такой, в строке найдены искомые данные, берётся часть строки в лево до ISO (начало строки) и вправо до след. ISO на след строке (этим опред. конец набора данных и получается целая строка с искомыми данными Hollander & JTG: Это тех. лог. работы терминала, данных много. Порезать пока нельзя (думал об этом), узнал что в перспективе есть (сервером занимаются другие). В архивации логики никакой, может месяц заполнятся, а может и полгода. Смысл, чел, возмоно пьяный (неадекватный) деньги заплатил и тока через месяц вспомнил что где-то что-то как-то не прошло и где-то его послали, вот тут ищется раб. терм. в логе, а он то уже ого-го. Так же см. первую часть. Спасибо за ссылку, буду пробовать. Как сделаю дам ответ, но не знаю когда, т.к. в пока опыта в таких вещах маловато. Спасибо всем. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск в файле | Zandrey | Microsoft Office Excel | 8 | 05.09.2008 12:23 |
поиск в файле | Elm0 | Паскаль, Turbo Pascal, PascalABC.NET | 14 | 07.06.2008 22:41 |
Поиск в файле | lin | Помощь студентам | 3 | 25.05.2007 08:40 |
Поиск в файле | asale | Microsoft Office Excel | 1 | 15.05.2007 23:33 |