powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрый поиск строки в файле.
25 сообщений из 31, страница 1 из 2
Быстрый поиск строки в файле.
    #39484453
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как лучше организовать поиск сроки(подстроки) в текстовом файле.
Проблема в том, что файлик уже весит более 4мб, и в нем уже более 70000 строк, грузить его в стринглисты и сравнивать со строкой весьма трудоемко, учитывая, что за жизненный цикл программы это операция может повторятся 1000-2000, в зависимости от входных данных.

Что бы было понятнее:
Имеем:
- Файл №1 со строками 70000+
- Файл №2 с 1000-2000 строками которые надо отсеять, т.е. если они уже встречаются в первом файле то не учитывать их. Разницу записать в файл №3.
- По окончанию работы с файлом №3 записать отсеянные строки в файл №1.

Я вижу два варианта событий:
1. загружаем файл №1 в переменную, в момент поступления данных (строки для сравнения) ищем вхождение в файле №1, если такого не имеется сразу пишем в файл(переменную) №3. Т.о. отсекается надобность во временном файле(переменной) №2.

2. загружаем файл №1 в переменную, получаем все данные в файл №2, отсеиваем их, и разницу записываем в файл №3.

Оба эти варианта ресурсоемкие, ибо работает церез циклы. Кидать это в поток смысла особо нет, меня не очень волнует фриз UI, тут скорее вопрос скорости обработки.
Что посоветуете?
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484458
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666,

TDictionary
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484460
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Валерий666Подскажите как лучше организовать поиск сроки(подстроки) в текстовом файле.
Проблема в том, что файлик уже весит более 4мб, и в нем уже более 70000 строк, грузить его в стринглисты и сравнивать со строкой весьма трудоемко, учитывая, что за жизненный цикл программы это операция может повторятся 1000-2000, в зависимости от входных данных.

Что бы было понятнее:
Имеем:
- Файл №1 со строками 70000+
- Файл №2 с 1000-2000 строками которые надо отсеять, т.е. если они уже встречаются в первом файле то не учитывать их. Разницу записать в файл №3.
- По окончанию работы с файлом №3 записать отсеянные строки в файл №1.

Я вижу два варианта событий:
1. загружаем файл №1 в переменную, в момент поступления данных (строки для сравнения) ищем вхождение в файле №1, если такого не имеется сразу пишем в файл(переменную) №3. Т.о. отсекается надобность во временном файле(переменной) №2.

2. загружаем файл №1 в переменную, получаем все данные в файл №2, отсеиваем их, и разницу записываем в файл №3.

Оба эти варианта ресурсоемкие, ибо работает церез циклы. Кидать это в поток смысла особо нет, меня не очень волнует фриз UI, тут скорее вопрос скорости обработки.
Что посоветуете?

посоветую не грузить файл в память, а читать его кусками
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484461
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666Что посоветуете?
Начать с изучения многопоточного программирования.
4 мб - это мелочи...

Мне тут тест подкидывали на сортировку файлов в 100 гигов.
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484468
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666Что посоветуете?

Меньший файл загружай в память (как уже сказали, в любую структуру, годящуюся для быстрого
поиска), больший файл обрабатывай построчно (и не забудь на нём использовать SetTextBuf
приличного размера).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484564
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CachedTexts + PosIgnoreCase
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484570
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, стоп
А строки сравниваются обычно или игнорируя регистр?
И в какой кодировке данные?

Короче, вываливай данные, забубеним тебе реализацию
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484576
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666операция может повторятся 1000-2000

простой поиск по файлу в таком случае - это мрак

или надо хэшировать строки и сравнивать хэши в певую очередь

или загонять в базу данных, чтобы искать по алфавиту, а не полным перебором
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484601
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий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 отсутствует - выведи ее в третий файл.

Десять строк кода, в сумме, не больше.
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484639
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Регистр везде будет нижний. кодировка не имеет значения, строки на латинице.

Жышы,

Можно подробнее?:-) с женериками не имел дел.
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484684
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666SOFT FOR YOU,

Регистр везде будет нижний. кодировка не имеет значения, строки на латинице.

Жышы,

Можно подробнее?:-) с женериками не имел дел.

Ну не хочешь дженерики - возьми TStringList, залей в него строки, потом включи сортировку.
Всё.
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484709
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666Можно подробнее?

можно. Идешь в Гугл - и с 2010 года уже написано 100500 статей про дженерики в Дельфи

ну например http://keeper89.blogspot.ru/2011/07/delphi-2.html

ЖышыЗалей первый файл в TDictionary

Кстати, народ жалуется, не всегда хорошо оно работает
https://habrahabr.ru/post/282902/
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484710
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUА строки сравниваются обычно или игнорируя регистр?
И в какой кодировке данные?
ну и как там с пробелами оконечными

.....в общем, еще вопрос что именно надо хэшировать
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484724
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

Я вот этими словарями давным-давно пользуюсь: https://github.com/fundamentalslib/fundamentals5
Ибо Д2007.
Работает хорошо.
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484752
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жышы,

Да, мне без разницы,лишь бы быстро работало, я просто говорю что с ними не имел дел. У меня D7, и видимо я не совсем слежу за изменениями в объектах)
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484756
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666,

а зачем D7 если можно перейти на Lazarus ?

ну либо пробуй fundamentals
это, конечно, метсорождение копипаста - но без родной поддержки в языке дженериков или темплейтов - других вариантов немного
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484765
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сегодня добрый :)

Код: 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.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Classes,
  System.Generics.Collections;

var
  i: Integer;
  List: TStringList;
  Dictionary: TDictionary<string,Integer>;

begin
  try
    List := TStringList.Create;
    try
      Dictionary := TDictionary<string,Integer>.Create;
      try
        List.LoadFromFile('2.txt');
        for i := 0 to List.Count - 1 do
          Dictionary.AddOrSetValue(List[i], 0);

        List.LoadFromFile('1.txt');
        for i := List.Count - 1 downto 0 do
        begin
          if (Dictionary.ContainsKey(List[i])) then
            List.Delete(i);
        end;

        List.SaveToFile('3.txt');
      finally
        Dictionary.Free;
      end;
    finally
      List.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484771
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

придется ему на Лазаря переходить, а то в его Д7 генериков нет :-)


SOFT FOR YOU
Код: pascal
1.
    List := TStringList.Create;



я тоже добрый, поэтому скажу сразу, что это весьма тормозной класс

по этому http://docwiki.embarcadero.com/Libraries/Seattle/en/System.IOUtils.TFile.ReadAllLines

Код: pascal
1.
2.
3.
4.
5.
ss: TStringDynArray; s: string;

        ss := TFile.ReadAllLines('2.txt');
        for s in ss do
          Dictionary.AddOrSetValue( s, 0);
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484821
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

У Шарахова были хеши для D7
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484877
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Видимо настал момент, когда даже тривиальные задачи уже не так легко решаемы в старых средах.... Спасибо за потраченное время!
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39484878
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666SOFT FOR YOU,

Видимо настал момент, когда даже тривиальные задачи уже не так легко решаемы в старых средах.... Спасибо за потраченное время!

http://guildalfa.ru/alsha/node/32
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39485022
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

Благодарю!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Быстрый поиск строки в файле.
    #39692653
Waitman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, у меня похожая задача как у автора топика но с той лишь разницей что надо в файл №3 записать только те строчки что совпали при проверке фала №1 и №2, не подскажите что в коде выше надо поправить ?
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39692654
Waitman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и забыл указать что размеры файлов немного побольше, №1 стабильный около 50 млн строк а №2 около 1млн не больше..
...
Рейтинг: 0 / 0
Быстрый поиск строки в файле.
    #39692908
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ такой же. Читаем оба файла, от каждой строчки считаем хеш, загоняем в контейнер по вкусу. Потом по всем элементам контейнера меньшего файла прогнать поиск в большем контейнере. Ну а сами строчки либо держать в памяти, либо хранить смещения и считывать их потом еще раз.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрый поиск строки в файле.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]