Как начать обработку файла со смещением?

Как начать обработку файла со смещением?

Пример использования: у вас есть файл журнала объемом в несколько ГБ за целую неделю, и вам нужно найти что-то, что произошло в субботу, например, с помощью grep. Делая обоснованное предположение, вы предполагаете, что начало поиска с середины файла сократит время обработки более чем вдвое (поскольку ему определенно не придется обрабатывать весь оставшийся файл), не пропуская при этом никаких релевантных данных. Возможно ли это?

решение1

Предположим, что ваши данные расположены в хронологическом порядке:

  1. Получите размер файла, перейдя к концу и выполнив ftell();
  2. Разделите этот результат на 2;
  3. Используйте fseek()для поиска этого места;
  4. Перейдите к началу следующей строки, вызвав getline()один раз;
  5. Используйте strptime(), чтобы узнать, на какой дате вы сейчас находитесь;
  6. Выполните бинарный поиск, повторяя шаги 4 и 5, пока не найдете нужную строку.

решение2

Вы можете использовать ddчто-то вроде:

dd if=log skip=xK bs=1M

что пропустит x * 1024 блоков размером 1M (2^20). dd(1)Подробности о его обработке единиц см. здесь.

Если вы хотите автоматизировать двоичный поиск, предполагая, что ваш журнал имеет обычный формат, <date> [data]в который вы можете направить вывод head -n 2, проверьте дату в началевторойочередь (которая — при разумном предположении, что очереди «обычно» длинные — будет полной) и решите, какую половину вы хотите.

решение3

Получите размер файла и разделите на 2. Разделите это на 1024, чтобы получить КиБ. (Или 1024*1024, чтобы получить МиБ и т. д.)

((fs = $(stat -c %s logfile) / 2 / 1024))

Пропустить и искать

dd if=logfile bs=1024 skip=$fs | grep blahblah

Вы могли бы более подробно рассказать об этом, если бы файл журнала былоченьв соответствии с объемом данных в день путем добавления count=значения к dd.

((cnt = $(stat -c %s logfile) / 5 / 1024))

dd if=logfile bs=1024 skip=$fs count=$cnt | grep blahblah

Это позволило бы передавать cnt * 1024байты данных по смещенным fs * 1024байтам.

Оформите все это в скрипт и перенаправьте данные за его пределы в grep, временный файл или куда захотите.

решение4

Не очень понятно, что именно вы хотите сделать и что вы подразумеваете под моим «процессом». Для больших файлов моя любимая интерактивная программа — less. Она без проблем обрабатывает большие файлы. Она также может переходить к определенному проценту, например, с помощью 30%. Кроме того, вы можете выполнять поиск с помощью /и ?.

Связанный контент