Я архивирую данные на DVD и хочу полностью упаковать DVD. Я знаю имена и размеры всех файлов, которые мне нужны на DVD, но я не знаю, сколько места занимают метаданные. Я хочу получить как можно больше файлов на каждый DVD, поэтому я использую эвристику Bubblesearch с жадной упаковкой. Я пробую 10 000 вариантов и выбираю лучший. В настоящее время я знаю размеры всех файлов, и, поскольку я не знаю, как файлы хранятся в файловой системе ISO 9660, я добавляю много помоев для метаданных. Я хотел бы сократить помои.
Я мог бы использовать genisoimage -print-size
, но он слишком медленный — учитывая 40 000 файлов, занимающих 500 МБ, это занимает около 3 секунд. 8 часов на каждый DVD не входит в планы. Я уже модифицировал исходный код genisoimage
и не собираюсь выжимать алгоритм из исходного кода; Я надеюсь, что кто-то знает лучший способ получить оценку или может указать мне полезную спецификацию.
Уточнение проблемы и вопроса:
Мне нужно записать архивы, которые разбиты на несколько DVD-дисков, обычно около пяти одновременно. Проблема, которую я пытаюсь решить, состоит в том, чтобы решить, какие файлы поместить на каждый DVD, чтобы каждый DVD (кроме последнего) был максимально заполнен. Эта задача является NP-трудной.
Я использую стандартный жадный алгоритм упаковки, при котором сначала помещается самый большой файл, а затем помещается на первый DVD, на котором достаточно места. Итак, j_random_hacker, я определенно не начинаю со случайного. Я начинаю с сортировки и использую Bubblesearch, чтобы изменить порядок, в котором файлы упакованы. Эта процедура улучшает мою упаковку примерно с 80% расчетной емкости до более чем 99,5% расчетной емкости. Этот вопрос касается лучшей оценки емкости; в настоящее время моя расчетная емкость ниже реальной емкости.
Я написал программу, которая пробует 10 000 возмущений, каждое из которых включает два шага:
- Choose a set of files
- Оцените, сколько места эти файлы займут на DVD
Шаг 2 — это шаг, который я пытаюсь улучшить. В настоящее время я «заблуждаюсь из-за осторожности», как предполагает Тайлер Д. Но я хотел бы сделать лучше. Я не могу позволить себе использовать
genisomage -print-size
, потому что он слишком медленный. Точно так же я не могу заархивировать файлы на диск, потому что это слишком медленно, но размер файла tar не соответствует размеру образа ISO 9660. Мне нужно предсказать размер изображения ISO 9660. В принципе это можно было бы сделать с полной точностью, но я не знаю, как это сделать. Вот в чем вопрос.
Примечание: эти файлы находятся на машине с 3 ТБ на жестком диске. Во всех случаях средний размер файлов не менее 10 МБ; иногда значительно больше. Так что вполне возможно, что genisomage
в конце концов будет достаточно быстрым, но я сомневаюсь в этом --- похоже, он работает, записывая образ ISO в /dev/null, и я не могу представить, что он будет достаточно быстрым, когда размер образа приближается к 4,7 ГБ. У меня нет доступа к этой машине прямо сейчас или когда я разместил исходный вопрос. Когда у меня будет доступ вечером, я постараюсь получить более точные цифры для вопроса. Но я не думаю, что genisomage
будет хорошим решением --- хотя это может быть хорошим способом изучить модель файловой системы, которая подскажет мне, как она работает. Знание того, что размер блока составляет 2 КБ, уже полезно.
Также может быть полезно знать, что файлы в одном каталоге записываются на один и тот же DVD, что упрощает поиск. Я хочу получить доступ к файлам напрямую, что исключает использование tar перед записью. (Большинство файлов являются аудио- или видеофайлами, что означает, что нет смысла пытаться поразить их с помощью gzip
.)