Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрый поиск строки в файле. / 25 сообщений из 31, страница 1 из 2
07.07.2017, 12:59
    #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
07.07.2017, 13:00
    #39484458
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск строки в файле.
Валерий666,

TDictionary
...
Рейтинг: 0 / 0
07.07.2017, 13:01
    #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
07.07.2017, 13:01
    #39484461
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск строки в файле.
Валерий666Что посоветуете?
Начать с изучения многопоточного программирования.
4 мб - это мелочи...

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

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

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

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

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

или загонять в базу данных, чтобы искать по алфавиту, а не полным перебором
...
Рейтинг: 0 / 0
07.07.2017, 14:50
    #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
07.07.2017, 15:20
    #39484639
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск строки в файле.
SOFT FOR YOU,

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

Жышы,

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

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

Жышы,

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

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

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

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

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

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

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

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

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

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

ну либо пробуй fundamentals
это, конечно, метсорождение копипаста - но без родной поддержки в языке дженериков или темплейтов - других вариантов немного
...
Рейтинг: 0 / 0
07.07.2017, 17:00
    #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
07.07.2017, 17:06
    #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
07.07.2017, 18:05
    #39484821
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск строки в файле.
Arioch,

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

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

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

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

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


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