Библиотека поиска в сортированном текстовом файле с фиксированной длиной строки

Автор:tema
Дата:28.02.2019
Просмотров:1750
Скачиваний:501
Оценка:, Оценок - 1
Скачать (zip-файл; Размер - 137761)

Обсудить в форуме

Описание

Библиотека поиска в сортированном текстовом файле с фиксированной длиной строки.

В файле для скачивания к библиотеки прилагается пример, реализующий функцию поиска в реестре малых предприятий, с необходимыми файлами.

Библиотека поиска в сортированном текстовом файле
Введение
Существуют справочники вида ключ-значение, в которых и ключ и значение могут быть представлены как строки фиксированной длины. Для упрощения работы с такими справочниками в продуктах семейства RS-Bank был реализован простенький класс TSTFS. Основная идея состоит в том, что если такой файл предварительно отсортировать, то потом можно использовать пропорциональный или половинный метод последовательных приближений для поиска в файле. Для файла не надо создавать структуру в словаре и конвертировать его в dbt.
Использование
Предполагается два сценария: простой и сложный с настройкой. Если разделитель табулятор и длина строки не больше 255 символов, то сценарий выглядит так:
1) Создание экземпляра класса с одновременным открытием файла.
2) Многократное использование метода Find.
Если необходимо настроить разделитель, то сценарий немного усложняется:
1) Создание экземпляра класса.
2) Настройка.
3) Открытие при помощи метода Open.
2) Многократное использование метода Find.
Небольшое исследование производительности на ИНН показало, что при реализации на RSL пропорциональный метод даёт худшую производительность, чем классический половинчатый, поэтому публикуется версия с методом половинного деления.
Конструктор TSTFS(filePath, separator)
filePath — необязательный параметр, путь к текстовому файлу, если задан, то файл открывается и происходит определение параметров файла.
separator — необязательный параметр, разделитель полей в текстовом файле.
Метод Open(filePath)
Метод необходимо вызвать после настройки свойств класса и перед использованием метода Find, если конструктор вызывался без параметра.
Метод Find(key)
Ищет в текстовом файле ключ key. Ключом считает первое поле с начала строки до первого разделителя. Если ключ не найден, то возвращается false. Если ключ найден, то возвращаемое значение зависит от количества полей в файле.
Если значения нет, т. е. ключ единственное поле в файле, то возвращается логическое true.
Если в файле одно значение, т. е. каждая строка имеет формат ключ, разделитель, значение, то возвращается строка со значнием.
Если в файле несколько значений, т. е. в строке несколько разделителей, то возвращается массив TArray со значениями.
Свойство separator
Позволяет установить разделитель, по умолчанию — табулятор.


UPD.
Также пишется версия на C в виде DLM. Работает быстрее. Пример РСМП на том же стенде где выдавал >3K проверок в секунду, на библиотеке DLM выдаёт >12K проверок в секунду. В файле используется 64-битная адресация, поэтому работатет с текстовыми файлами >2Gb.
https://github.com/kb392/txtkv-dlm

Для проверки был заготовлен файл из sha256 всех возможных паспортов РФ. Размер получился 700+ GB. Файл c хэшами от ФинЦЕРТа проверился по этой базе секунд за 20.

Текст примера

 00000000501545f3bc1b72f3ae3ad3c4857b9c807eff909e3b5d0710ef76e0e7,1366676024
000000005e8260fc2eebe89d976406e2c5011420d4cb1e4eb5dd2abd0ac7a4f9,2532194062
000000068d27c98ed9ab876bff54a156d0d7a2505c1ae191abbf39a259390e03,1492929864
00000007ebecff484a98fdc5e9b401a9544bfca37bdf1597e59f5536c0c922c8,1475470136
0000464cec5e3b7d0f96c6a9117380a787fc3f87baba47505eee40dbc6a2743c,2634222492
0000464d4d8f393d7688dc8590b967344128210f7207672a3f11f0230f577fd4,0835708226
000046542544219c4fcc2e44c0703c2853bab7dd60d44a6bdf32da697faf3e36,1460884506
000046566cbec82ddbc72ebf89022f58f1f40d1e4a80c4c9ea1599f5054f8cec,0855303803
19997c749a0eb604bcffed44266270e8ac90f6de51f6b8636bc7caa75c61aaaf,1373419067
19997c74dd621fa6ab37688f65aefb8420e105bac8e5450e8e041cdf8c0c8a01,0264018161
19997c764d0c149154b4d8f5dd9544d84fa88a78354aba358b92d4f9888f1844,1841083732
19997c7656afe87dfda6e9f22de8fe95d180fe99c4c5dd75f95785483a0a5c40,0578221676
33330b6710755c50a9853d4cceeb2a3b1a9df07129ab5b094fe652fbb2475548,2548038868
33330b67ab705880b88b2fbcf9eb8e87849847914dc28e79db638160a3de98c0,0558848894
33330b6979a62713e60f02ffc5a7ad8e1914e25bd7c2752aef57cd5808fcf813,1465908841
33330b6b597a1f78b8e4a328c6e12c8c73821b35823d49b05f25929086b080c8,2274426649
ffffdee0b746241eb74cffa7b19d6f171625df2e511fff13e22938c5aa279c20,2789095910
ffffffd06d174e43fb761d27ad11edd7c44875cdfe204f1beefb90e592419f28,1748471781





import "txthsearch-lib.mac";

var r;
var obj=TSTFS("hash.csv",",");



var hash="33330b6b597a1f78b8e4a328c6e12c8c73821b35823d49b05f25929086b080c8";
r=obj.Find(hash);
if (ValType(r)==V_STRING)
    PrintLn(r);
else
    PrintLn(hash + " хэш не декодирован "+String(r));
end;