|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
|||||||||||
Самый быстрый поиск строки в файле ANSI06.03.2023, 16:06. Показов 1904. Ответов 33
Метки нет (Все метки)
Я давно уже ищу способ самого быстрого поиска строки в обычном текстовом файле ANSI. Вообще эта процедура быстрая, но если искать ключевую фразу, без учёта регистра, то это уже будет намного дольше по времени... Итак мне нужно найти фразу, все вхождения этой фразы, внутри файла TXT. Просто получить список найденных строк внутри файла. В листбокс например. Всё равно найденного будет не так много. Строк 10 например. ListBox я рассматриваю только для примера поиска конечно же.
Я очень долго искал способ наибыстрейшего поиска. Чтобы искало так же быстро как и в Total Commander'е например. Но скорости такой как в Total Commander, пока не смог достичь... Но всё равно я значит продвинулся в этом вопросе вдруг узнав о том, что если файл загружать не весь полностью сразу, а частями, тогда скорость будет в 2 раза больше... Итак вот мой код (с преобразованием регистров):
Функция не дописана до конца. С буферными кусочками ещё работать надо бы. Длина поисковой строки тоже ограничена 260 символами, а это тоже не очень хорошо. Дело в том что в VB нет функции InStrRevB. Которая в этом коде мне так нужна... Дело в том, что я работаю всё время только лишь с ANSI строкой. И поиск ищу тоже внутри ANSI строки, чтобы экономить время на преобразованиях кодировок. Для 70 Мб файла у меня 550 млск в среде VB6 ищет и 450 млск в EXE, со всеми галочками оптимизации. Это супер быстрая скорость. Но я думаю, можно ещё быстрее, если знать как... Преобразование регистров осуществляется функцией CharLowerBuff потому что встроенная VB6 функция LCase$ не преобразовывает как надо регистры если строка ANSI. А у меня строка именно в ANSI кодировке получается. Хотя LCase скорее всего будет быстрее чуть-чуть. Можно конечно попробовать написать эту функцию и работать со строка понятными для VB6 в кодировке UTF16 но на преобразование ушло бы значительное время, когда файлы 50-100 Мб. В которых всё происходит и идёт поиск... VB6 хранит строки по умолчанию в кодировке UTF16 LE только без нуль-символа на конце? Наверное... Так в моём коде идёт работа исключительно с ANSI строками. Поэтому этот код только для файлов ANSI. Добавлено через 1 час 11 минут Сейчас ещё по быстрому написал функцию, но только для обработки строк в уникоде. Ну то есть файл конечно загружается ANSI но в уникодную строку VB. Так как строка уже уникодная, то работа уже идёт с родными функциями VB это с помощью функций LCase, InStrRev... Как я и ожидал, для 70 Мб это заняло ажно на 100 млск больше, чем при работе с анси строками. То есть 515 млск. А в моём первом варианте 420 млск где-то. Вот собственно код (он недоработан был написан по быстрому чисто для проверки):
Как вы видите, такие варианты, как с загрузкой и поиском через массив, например, я вообще даже не рассматриваю - это слишком долго по времени было бы, поэтому я ищу поисковую фразу, а потом сам вычленяю нужную строку из файла, искав следующий и предыдущий vbcrlf от найденной фразы. Добавлено через 48 минут Думал немного убыстрить с помощью поиска по vbTextCompare но это, как оказалось, работает только в уникодных строках с помощью InStr обычного, а с помощью InStrB сравнение vbTextCompare уже не сработало в ансишной строке. Но немного изменив уникодную функцию поставив сравнение в InStr vbTextCompare я смог там чуть-чуть увеличить скорость до 499 млск. А вообще самое медленное это Option Compare Text я помню раньше всегда его любил вставлять во все формы и во все модули своих всех проектов. Был идиотом. Пока однажды вдруг не узнал, что это ни только просто медленно но ещё и способно полностью подвесить всю систему даже если оперировать строками по 100Мб например. Помню, только одна фраза Option Compare Text заставила полностью зависнуть одновременно все работающие программы, которые написаны на VB6. Хотя теоретически такого быть не должно. Но у меня было это реально. С тех пор я ненавижу Option Compare Text и отказался от его использования абсолютно везде. Добавлено через 2 часа 4 минуты Ещё из моих наблюдений сейчас: функции StrStr и StrStrI работают медленнее, чем обычный InStr или InStr с сравнением vbTextCompare. А в больших циклах - гораздо медленнее.
0
|
|||||||||||
| 06.03.2023, 16:06 | |
|
Ответы с готовыми решениями:
33
Быстрый поиск строки в файле. Задачка самый быстрый поиск Каков самый быстрый способ узнать количество строк в оргомном текстовом файле в Windows? |
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
||||||||
| 10.03.2023, 19:20 [ТС] | ||||||||
|
Если бы регулярка Like выдавала бы индекс вхождения вместо True и False было бы куда проще с поисками
Добавлено через 2 минуты Добавлено через 9 минут Добавлено через 10 минут Кстати функцию StrChrIA можно самому написать получается, которая будет работать в 100 раз быстрее чем майкрософтовская. Добавлено через 5 часов 8 минут Написал сегодня вот новую технологию, на основе поиска первого символа и просмотра маленьких участков памяти.
0
|
||||||||
|
Модератор
|
||||||||||||
| 10.03.2023, 20:31 | ||||||||||||
|
Добавлено через 33 минуты ![]() Добавлено через 12 минут Вот еще мой вариант:
1
|
||||||||||||
|
Модератор
|
||||||
| 10.03.2023, 21:36 | ||||||
Сообщение было отмечено HackerVlad как решение
Решение
Как и обещал вариант без преобразования регистра:
1
|
||||||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
|||
| 10.03.2023, 22:27 [ТС] | |||
|
Там чтобы найти начало строки нужно бы использовать InStrRevB, функцию которой не существует, поэтому её пришлось бы писать самому через RightB$ Добавлено через 4 минуты Ну я там сильно не проверял... Писал на скорую руку... Добавлено через 1 минуту Ну формулу я перепишу и всё будет правильно работать конечно эту ошибку легко будет исправить, суть не в этом, а суть в том стоит ли мне допиливать всю эту функцию... Добавлено через 32 секунды У меня был просто спортивный интерес а смогу я сделать быстрее. Смог.
0
|
|||
|
Модератор
|
||
| 10.03.2023, 22:33 | ||
|
0
|
||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
|||
| 10.03.2023, 22:42 [ТС] | |||
|
Добавлено через 2 минуты
0
|
|||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
||
| 10.03.2023, 23:18 [ТС] | ||
|
Добавлено через 5 минут Ты ведь понимаешь почему моя функция StrChrIA работает быстрее чем майкрософтовская. Потому что я один раз ищу в огромном массиве и проверяю, является ли байт, большой или маленькой буквой. А как работает код майкрософта? Я и без дизассемблера скажу что их код преобразовывает в другой регистр всю полностью огромную строку, и лишь потом сравнивает в цикле. Я не произвожу преобразование регистров, для огромной строки. Поэтому у меня в сто раз быстрее. Добавлено через 4 минуты Спасибо большое, The trick, видишь ты написал функцию гораздо быстрее и лучше чем у меня. Именно поэтому я свою до конца и не дописывал, потому что знал что может от неё откажусь и буду пользоваться твоей новой функцией)))) Единственный минус - очень медленно в VB. Добавлено через 1 минуту Знаешь, я даже думал прогнать два раза memchr будет быстрее. Для большого и для маленького символа. Хоть весь файл и два раза прогонять придётся. Всё равно быстрее будет. Добавлено через 2 минуты Ты свою сверхбыструю функцию написал же по этой технологии? Поиск первого символа большого или маленького? Я просто сильно не вникал... Добавлено через 17 минут Посмотрел я твой код. Очень интересный. Понравилась фича GoTo continue. Классно придумал, а я давно думал почему в VB циклах нет continue, очень не хватает иногда, в отличии от других языков, где мы привыкли к continue. Удобно переходить к следующей интерации конечно.
0
|
||
|
Модератор
|
|||
| 10.03.2023, 23:19 | |||
|
0
|
|||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
|||
| 10.03.2023, 23:25 [ТС] | |||
|
Добавлено через 1 минуту
0
|
|||
|
Модератор
|
|||
| 10.03.2023, 23:27 | |||
|
Добавлено через 1 минуту
0
|
|||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
||
| 10.03.2023, 23:30 [ТС] | ||
|
0
|
||
|
Модератор
|
||
| 10.03.2023, 23:34 | ||
|
1
|
||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
||||
| 10.03.2023, 23:46 [ТС] | ||||
|
Добавлено через 1 минуту Ну да, я согласен, что нам не сильно важно для IDE. Просто помню, как ты написал функцию подсчёта строк, там было разделение на для EXE и для VB. Мне это хорошо запомнилось) Особенно когда выдало разный результат в EXE и VB. Думал и тут будет так же просто))) Добавлено через 2 минуты Добавлено через 46 секунд Добавлено через 3 минуты DLL натив API, честно, я писал только на дельфи, ибо в VB6 нельзя. Хочешь прикол расскажу. Когда писал DLL перепробовал все версии дельфи, и только одна старая версия выдавала самый быстрый результат по скорости. Новая версия точно медленная. Старая версия одна хорошо по скоростям, Четвёртая что ли по моему, уже точно не помню. Добавлено через 57 секунд А какую я функцию писал? Да эту же самую. Тогда потому что не умел быстро на VB достичь быстрого результат. А там же у них класс TString и так далее. Там у них много классных фишек. Добавлено через 1 минуту У меня уже написана библиотека DLL на дельфи то есть. Но там всё равно медленее конечно скорость чем твой супер идеальный код этот новый)))))) Добавлено через 1 минуту И на С++ я тоже писал эту функцию. Тоже нихрена не получилось по скорости. На дельфи более ни менее быстро вышло.
0
|
||||
| 10.03.2023, 23:46 | |
|
Самый быстрый способ получить хеш строки Самый быстрый способ получения первых двух элементов строки Быстрый поиск ip адреса в текстовом файле
Самый быстрый поиск в двух векторах или векторе пар (массивах или других контейнерах) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Новости компьютерного мира и их обсуждение (4)
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
|