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

0 (0)
  • Развернуть Обсуждение:Библиотека поиска в сортированном текстовом файле с фиксированной длиной строки ( Обсуждение примера  05.03.2019 08:08 )
    5(1)
    Библиотека поиска в сортированном текстовом файле с фиксированной длиной строки.

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

    Библиотека поиска в сортированном текстовом файле
    Введение
    Существуют справочники вида ключ-значение, в которых и ключ и значение могут быть представлены как строки фиксированной длины. Для упрощения работы с такими справочниками в продуктах семейства 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.

    Посмотреть пример
    >> Ответить