Squeak.ru - шаблоны программирования

Использование интерполяционного поиска для поиска начала списка в большом текстовом файле — Python

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

  goal_tolerance[0]: 
    name: joint_b
    position: -1
    velocity: -1
    acceleration: -1

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

Число после goal_tolerance — это счетчик, увеличивающийся на 1 каждый раз, когда шаблон повторяется, поэтому я хотел бы использовать это число для вычисления начала шаблона. То, что у меня есть сейчас, выглядит примерно так:

if '  goal_tolerance' in line:
    gtolnum = line[17:-3]
    print gtolnum
    startFrom = currentPosition - ((long(gtolnum) + 1) * 95)
    break

Однако при этом не учитывается количество символов в счетчике, поэтому я прохожу цикл поиска несколько раз больше, чем необходимо. Есть ли быстрый способ включить эти символы в расчет?

РЕДАКТИРОВАТЬ: я не читаю весь файл, чтобы добраться до этой точки, так как он большой, и у меня есть несколько сотен временных меток для поиска в нескольких сотнях файлов журнала. Моя функция поиска ищет позицию в текстовом файле, затем находит начало строки рядом с этой точкой и читает ее. Вычисление определяет позицию файла, которую я могу использовать с .seek() на основе количества байтов или символов в шаблоне.


  • не достаточно ясно, чтобы помочь: откуда берется 95? если читать задом наперёд, то какой смысл искать ту скороговорку, всё остальное уже прочитано. 23.01.2018
  • Уточнено в редактировании. 95 — это количество символов в каждой итерации шаблона. Однако шаблон повторяется несколько сотен тысяч раз, поэтому количество символов увеличивается до 100 из-за счетчика. 24.01.2018
  • Вместо того, чтобы редактировать свой вопрос с решением, вы должны добавить его в качестве ответа ниже и пометить как принятое. 24.01.2018

Ответы:


1

Тем временем я немного подсчитал и нашел математическое решение:

...
n = long(gtolnum)
q = len(gtolnum)        # I'll refer to this as the number's "level"
x = n + 1 - 10**(q - 1) # Number of entries in the current level
c = x * (q - 1)         # Additional digits in the current level
i = 2
p = 0
while i < q:
    p += 9 * (q - i) * (10**(q - i))  # Additional digits in i levels previous
    i += 1
startFrom = currentPosition - ((n + 1) * 95 + p + c)
...

Кажется, должно быть гораздо более простое решение, но я его не вижу. Возможно, функция журнала может помочь?

24.01.2018
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...