Возможно ли получить список файлов, диапазон байтов от заголовка файла tar + bzip2?

По сути, я надеюсь, что кто-то с передовыми знаниями о tar / bz2 может ответить, возможно ли это.

Ситуация заключается в том, что у нас есть периодический 24-гигабайтный поток данных от поставщика, как .tbz-файл. (Смола + bzip2). Это загружается от поставщика через завиток. Чтобы резко ускорить этот медленный процесс, я бы хотел получить:

  • Список файлов, содержащихся в файле .tbz.
  • байтовые диапазоны конкретных файлов, которые нам интересны (небольшое подмножество всего архива).

Curl имеет возможность указать диапазон байтов для загрузки файла, поэтому я надеюсь, что если мы загрузим первые x байты файла, у него может быть указатель того, где мы должны искать эти соответствующие файлы. Из того, что я понимаю, у tar есть эта информация, но я не уверен, что компрессия bzip2 позволяет это дополнительно.

Нет.

Tar – это объединение данных файлов, чередующихся с метаданными файлов (tar-заголовки). Это само по себе не обязательно является тупиком, поскольку можно прочитать заголовок, узнать длину данных и (если сервер разрешил это) перейти к следующему заголовку (например, с помощью той же функции, которая позволяет возобновить передачу HTTP).

Что действительно затрудняет сжатие – де- / сжатые данные обычно зависят от предыдущих, таким образом, от всего, что предшествует этому. Теперь для bzip2 все это блок от 100 кБ до 900 КБ (с шагом 100 КБ IIUC). Таким образом, ваш алгоритм должен:

  1. получить начало файла;

  2. читать декомпрессированную длину блока L из заголовка;

  3. распаковать блок – это означает, что загрузка данных по мере необходимости будет достигнута до тех пор, пока не будет достигнут конец блока bz2;

  4. проверьте заголовок и длину заголовка H заголовка tar первого файла и D его данных;

  5. перейдите к следующему файлу: либо он находится в декодированном блоке ( H + D < L ), либо должны быть извлечены дополнительные сжатые данные ( H + D > L ). И это именно то, где он ломается – если я правильно понимаю формат bzip2, заголовок не содержит длину сжатого блока (только несжатый). Следовательно, если вам нужно извлечь другой блок, вы не можете действительно искать поток, даже если базовый носитель вам разрешил.

Резюме: если вы можете согласовать изменение формата с тем, что содержит сжатый размер блока в своем заголовке, оно разрешимо. С другой стороны, один сжатый tar-файл объемом 24GB является довольно сумасшедшим форматом для распространения чего-либо – это один однослойный BD, и я не думаю, что разумный человек подумает о сжатии содержимого, чтобы перейти на диск в один файл вместо того, чтобы разделить его на части размером не более 1-2 ГБ. Поэтому, если переговоры возможны, попробуйте спросить об этом (разбившись на более мелкие кусочки).

Еще одна вещь, которая могла бы помочь вам немного, – получить список файлов вместе с размерами файлов по отдельности – это позволит вам сделать хотя бы некоторые догадки о том, что делать с загрузкой (и вы всегда можете прибегнуть, если понадобится). Такой список можно легко создать – просто перенаправив stdout tar в файл:

 tar cvv all_the_uncompressed_gigabytes 2>list.txt | bzip2 -9 > data.tar.bz2