|
|
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Подскажите как лучше организовать поиск сроки(подстроки) в текстовом файле. Проблема в том, что файлик уже весит более 4мб, и в нем уже более 70000 строк, грузить его в стринглисты и сравнивать со строкой весьма трудоемко, учитывая, что за жизненный цикл программы это операция может повторятся 1000-2000, в зависимости от входных данных. Что бы было понятнее: Имеем: - Файл №1 со строками 70000+ - Файл №2 с 1000-2000 строками которые надо отсеять, т.е. если они уже встречаются в первом файле то не учитывать их. Разницу записать в файл №3. - По окончанию работы с файлом №3 записать отсеянные строки в файл №1. Я вижу два варианта событий: 1. загружаем файл №1 в переменную, в момент поступления данных (строки для сравнения) ищем вхождение в файле №1, если такого не имеется сразу пишем в файл(переменную) №3. Т.о. отсекается надобность во временном файле(переменной) №2. 2. загружаем файл №1 в переменную, получаем все данные в файл №2, отсеиваем их, и разницу записываем в файл №3. Оба эти варианта ресурсоемкие, ибо работает церез циклы. Кидать это в поток смысла особо нет, меня не очень волнует фриз UI, тут скорее вопрос скорости обработки. Что посоветуете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 12:59 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666, TDictionary ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 13:00 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666Подскажите как лучше организовать поиск сроки(подстроки) в текстовом файле. Проблема в том, что файлик уже весит более 4мб, и в нем уже более 70000 строк, грузить его в стринглисты и сравнивать со строкой весьма трудоемко, учитывая, что за жизненный цикл программы это операция может повторятся 1000-2000, в зависимости от входных данных. Что бы было понятнее: Имеем: - Файл №1 со строками 70000+ - Файл №2 с 1000-2000 строками которые надо отсеять, т.е. если они уже встречаются в первом файле то не учитывать их. Разницу записать в файл №3. - По окончанию работы с файлом №3 записать отсеянные строки в файл №1. Я вижу два варианта событий: 1. загружаем файл №1 в переменную, в момент поступления данных (строки для сравнения) ищем вхождение в файле №1, если такого не имеется сразу пишем в файл(переменную) №3. Т.о. отсекается надобность во временном файле(переменной) №2. 2. загружаем файл №1 в переменную, получаем все данные в файл №2, отсеиваем их, и разницу записываем в файл №3. Оба эти варианта ресурсоемкие, ибо работает церез циклы. Кидать это в поток смысла особо нет, меня не очень волнует фриз UI, тут скорее вопрос скорости обработки. Что посоветуете? посоветую не грузить файл в память, а читать его кусками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 13:01 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666Что посоветуете? Начать с изучения многопоточного программирования. 4 мб - это мелочи... Мне тут тест подкидывали на сортировку файлов в 100 гигов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 13:01 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666Что посоветуете? Меньший файл загружай в память (как уже сказали, в любую структуру, годящуюся для быстрого поиска), больший файл обрабатывай построчно (и не забудь на нём использовать SetTextBuf приличного размера). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 13:08 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
CachedTexts + PosIgnoreCase ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:20 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Так, стоп А строки сравниваются обычно или игнорируя регистр? И в какой кодировке данные? Короче, вываливай данные, забубеним тебе реализацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:27 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666операция может повторятся 1000-2000 простой поиск по файлу в таком случае - это мрак или надо хэшировать строки и сравнивать хэши в певую очередь или загонять в базу данных, чтобы искать по алфавиту, а не полным перебором ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:34 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666Подскажите как лучше организовать поиск сроки(подстроки) в текстовом файле. Проблема в том, что файлик уже весит более 4мб, и в нем уже более 70000 строк, грузить его в стринглисты и сравнивать со строкой весьма трудоемко, учитывая, что за жизненный цикл программы это операция может повторятся 1000-2000, в зависимости от входных данных. Что бы было понятнее: Имеем: - Файл №1 со строками 70000+ - Файл №2 с 1000-2000 строками которые надо отсеять, т.е. если они уже встречаются в первом файле то не учитывать их. Разницу записать в файл №3. - По окончанию работы с файлом №3 записать отсеянные строки в файл №1. Я вижу два варианта событий: 1. загружаем файл №1 в переменную, в момент поступления данных (строки для сравнения) ищем вхождение в файле №1, если такого не имеется сразу пишем в файл(переменную) №3. Т.о. отсекается надобность во временном файле(переменной) №2. 2. загружаем файл №1 в переменную, получаем все данные в файл №2, отсеиваем их, и разницу записываем в файл №3. Оба эти варианта ресурсоемкие, ибо работает церез циклы. Кидать это в поток смысла особо нет, меня не очень волнует фриз UI, тут скорее вопрос скорости обработки. Что посоветуете? 1. Залей первый файл в TDictionary 2. В цикле прогони второй файл, проверяя наличие каждой строки в TDictionary. 2.1. Если строка TDictionary отсутствует - выведи ее в третий файл. Десять строк кода, в сумме, не больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:50 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Регистр везде будет нижний. кодировка не имеет значения, строки на латинице. Жышы, Можно подробнее?:-) с женериками не имел дел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 15:20 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666SOFT FOR YOU, Регистр везде будет нижний. кодировка не имеет значения, строки на латинице. Жышы, Можно подробнее?:-) с женериками не имел дел. Ну не хочешь дженерики - возьми TStringList, залей в него строки, потом включи сортировку. Всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 15:48 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666Можно подробнее? можно. Идешь в Гугл - и с 2010 года уже написано 100500 статей про дженерики в Дельфи ну например http://keeper89.blogspot.ru/2011/07/delphi-2.html ЖышыЗалей первый файл в TDictionary Кстати, народ жалуется, не всегда хорошо оно работает https://habrahabr.ru/post/282902/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 16:02 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUА строки сравниваются обычно или игнорируя регистр? И в какой кодировке данные? ну и как там с пробелами оконечными .....в общем, еще вопрос что именно надо хэшировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 16:03 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Arioch, Я вот этими словарями давным-давно пользуюсь: https://github.com/fundamentalslib/fundamentals5 Ибо Д2007. Работает хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 16:23 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Жышы, Да, мне без разницы,лишь бы быстро работало, я просто говорю что с ними не имел дел. У меня D7, и видимо я не совсем слежу за изменениями в объектах) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 16:43 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666, а зачем D7 если можно перейти на Lazarus ? ну либо пробуй fundamentals это, конечно, метсорождение копипаста - но без родной поддержки в языке дженериков или темплейтов - других вариантов немного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 16:47 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Я сегодня добрый :) Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 17:00 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, придется ему на Лазаря переходить, а то в его Д7 генериков нет :-) SOFT FOR YOU Код: pascal 1. я тоже добрый, поэтому скажу сразу, что это весьма тормозной класс по этому http://docwiki.embarcadero.com/Libraries/Seattle/en/System.IOUtils.TFile.ReadAllLines Код: pascal 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 17:06 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Arioch, У Шарахова были хеши для D7 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 18:05 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Видимо настал момент, когда даже тривиальные задачи уже не так легко решаемы в старых средах.... Спасибо за потраченное время! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 20:05 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Валерий666SOFT FOR YOU, Видимо настал момент, когда даже тривиальные задачи уже не так легко решаемы в старых средах.... Спасибо за потраченное время! http://guildalfa.ru/alsha/node/32 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 20:06 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
asviridenkov, Благодарю! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2017, 11:04 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, у меня похожая задача как у автора топика но с той лишь разницей что надо в файл №3 записать только те строчки что совпали при проверке фала №1 и №2, не подскажите что в коде выше надо поправить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 21:15 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Да и забыл указать что размеры файлов немного побольше, №1 стабильный около 50 млн строк а №2 около 1млн не больше.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 21:19 |
|
||
|
Быстрый поиск строки в файле.
|
|||
|---|---|---|---|
|
#18+
Ответ такой же. Читаем оба файла, от каждой строчки считаем хеш, загоняем в контейнер по вкусу. Потом по всем элементам контейнера меньшего файла прогнать поиск в большем контейнере. Ну а сами строчки либо держать в памяти, либо хранить смещения и считывать их потом еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2018, 12:05 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39484639&tid=2040486]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
183ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 508ms |

| 0 / 0 |
