Утиліта для оптимального розподілу файлів на декількох DVD?


11

У мене є маса мультимедійних файлів, які я хочу записати на DVD, але оскільки кожен DVD вміщує лише 4,5 ГБ, я повинен знайти оптимальний спосіб впорядкування файлів для використання мінімальної кількості DVD-дисків (інакше порожній простір залишається в кожному DVD можна легко додавати). Чи є інструменти, які допоможуть у цьому?

Багато років тому існувала утиліта DOS, щоб зробити це за допомогою дискети.


1
Ні, я не шукаю стиснення та розщеплення. Я хочу розповсюджувати файли спочатку (файлова система), щоб кожен диск міг використовуватися безпосередньо.
Алекс R

Просто відчував , що це була хороша сторінка для всіх , хто шукає: howtogeek.com/76264 / ...
Nav

Відповіді:


3

Спробуйте безкоштовний DVD Span :

DVD Span - це резервний інструмент для запису вмісту великих папок на кілька DVD. DVD Span може автоматично визначити кращу організацію кожного диска, щоб розмістити максимальну кількість даних на мінімальній кількості дисків. DVDSpan - це чудовий інструмент для резервного копіювання музичної колекції, фотографій або навіть усього жорсткого диска на DVD. А оскільки він виробляє звичайні DVD-диски (або компакт-диски), для читання або відновлення ваших резервних копій не потрібно спеціального програмного забезпечення.


2

Ах, проблема Рюкзака . Я міг би знайти тільки один онлайн вирішувач для цього тут . Ваш розмір рюкзака склав би 4,5 Гб, а кожен пакет буде розміром з вашими файлами. Вам потрібно буде трохи помасажувати його вихід, щоб відповідати вашому конкретному застосуванню, але це має бути працездатним. Це звичайно не дуже швидко, тому що ця проблема є складною .


Так, це справді неповна проблема, але для цього практичного застосування рішення жорстокої сили досить швидко :)
Alex R

1
Це не еквівалентно проблемі з рюкзаком, а проблемі з упаковкою у бін (1-D) , для якої існує точний алгоритм .
Кенні Евітт

2

Огляд

Відповідь Джеффа Шаттока правильна, що це еквівалентно (або ізоморфно, як пишуть математики) проблемі комбінаторної оптимізації, але це еквівалентно 1-мірній проблемі упаковки у бін , а не проблемі рюкзака .

Пощастило для вас, я маю поділитися кодом, який вирішить цю проблему для вас чи когось іншого, з доступом до комп’ютера Windows із встановленою принаймні версією 3.5 .NET Framework.

Грубе рішення

  1. Спочатку завантажте та встановіть LINQPad .

  2. По-друге, завантажте запит LINQPad, про який я щойно писав - ось linkq (ha) до необробленого файлу. Збережіть його як .linq- файл і відкрийте його в LINQPad.

  3. Змінення параметрів:

    Ось частина коду запиту LINQPad, яку слід змінити:

    int binSizeMb = 4476; // This is the (floor of the) total size of a DVD+R reported by CDBurnerXP. string rootFileFolderPath = @"F:\2006 - Polyester Pimpstrap Intergalactic Extravaganza multicam";

    Змініть binSizeMbрозмір свого "кошика", наприклад CD, DVD, напр. int binSizeMb = 650;для компакт-диска.

    Примітка - binSizeMbзначення інтерпретується як те, що іноді називають мебібайт . На відміну від мого дитинства, коли всі кратні байти були "двійковими", іноді "MB" тепер посилається на "десятковий мегабайт" або рівно 1 000 000 байт, на відміну від 1048 576 байт мебібайт (MiB), який використовується в моєму коді . Якщо ви хочете змінити це, змініть рядок const int bytesPerMb = 1048576;у коді на const int bytesPerMb = 1000000;.

    Перейдіть rootFileFolderPathна повний шлях до папки, що містить файли, які ви хочете "спакувати в біни", напр. string rootFileFolderPath = @"C:\MySecretBinFilesFolder";.

  4. Запустіть запит, натиснувши F5або натисніть кнопку " Виконати" у верхньому лівому куті вкладки запитів.

Результати

Код запиту буде перераховувати всі файли в rootFileFolderPathпапці, рекурсивно, тобто він включає також файли у всіх папках.

Тоді він створить 'бункери' для файлів таким чином, що загальний розмір усіх файлів у кожному біні буде меншим або рівним вказаному розміру біна.

На панелі результатів LINQPad ви побачите два списки.

Перший список - це всі знайдені файли, перелічені у порядку зменшення за розміром.

Другий список - це бункери, створені за допомогою "упаковки файлів", зі списком файлів та їх розмірами, а також розміром залишків.

Ось скріншот, на якому показаний другий список та два створені перші бункери:

Скріншот LINQPad, що показує список бункерів

Короткий аналіз

Згідно з Вікіпедією, алгоритм, який я використовував, - стратегія First Fit зменшення (FFD) - не повинен бути надто поганим; У Вікіпедії зазначено:

У 2007 році було доведено, що зв'язані 11/9 OPT + 6/9 для FFD є жорсткими.

"OPT" означає оптимальну стратегію (як щось потенційно недосяжне, а не якусь конкретну стратегію).

Виходячи з моїх дещо нечітких спогадів про математичні терміни, це повинно означати, що стратегія FFD повинна, в гіршому випадку, упакувати предмети в ~ 1,22 рази більше кількості бункерів, що оптимальна стратегія. Отже, ця стратегія може упакувати предмети в 5 бункерів замість 4. Я підозрюю, що її ефективність може бути дуже близькою до оптимальної, за винятком конкретних "патологічних" розмірів предметів.

У тій же статті Вікіпедії також зазначено, що існує "точний алгоритм" . Я також можу вирішити це здійснити. Мені доведеться спочатку прочитати папір, яка описує алгоритм.


0

Ви можете використовувати будь-який інструмент стиснення, який дозволяє розділити архів, я думаю


1
Стиснення - це не те, що я шукаю. Це робить його занадто громіздким для доступу до файлів.
Alex R

0

Ви можете взяти один із варіантів програми в посібнику з автостопом до Хаскелл , можливо, опрацювавши частину цього підручника; підручник написаний навколо вирішення саме вашої проблеми розподілу речей на декілька дисків, завдяки чому рішення поступово вдосконалюється, як це пояснюється наступним уривком з розділу 3 підручника:

Досить попередніх ліній. підемо спакувати кілька компакт-дисків.

Як ви вже могли визнати, наша проблема є класичною. Це називається "проблема з рубанням" ( гугл вгору , якщо ви вже не знаєте, що це таке. Є більше 100000 посилань).

почнемо з жадного рішення ...

Більше ідей: пов'язане питання

Ось аналогічне запитання (хоча і не те саме: його не вимагають оптимізації там), де ви можете знайти більше корисних рішень / програм для свого завдання (якщо вони будуть розміщені):

Деякі підказки для розуміння програмування у запропонованому навчальному посібнику

Взагалі, код Haskell досить виразний (оскільки Haskell - мова для програмування на високому рівні абстракції), а значить, його можна легко зрозуміти.

Дивлячись на код одного з рішень, пам’ятайте, що структура верхнього рівня програми, яку ми хочемо написати, досить проста, як це сказано в главі 1 підручника:

Тепер давайте на хвилину подумаємо про те, як буде працювати наша програма, і висловимо її у псевдокоді:

main = Read list of directories and their sizes.
       Decide how to fit them on CD-Rs.
       Print solution.

Звучить розумно? Я так думав.

Давайте трохи спростимо наше життя і припустимо, що зараз ми будемо обчислювати розміри каталогів десь поза нашою програмою (наприклад, з " du -sb *") та читати цю інформацію з stdin.

і далі уважніше подивіться на частини рішення.



0

Також спробуйте Discfit, який вибирає файли та каталоги для копіювання на різні диски:

https://sourceforge.net/projects/discfit/


Відповідь лише за посиланням - це не найкраща відповідь. Рекомендуючи програмне забезпечення, будь ласка, дотримуйтесь цього контуру . Слід розширити ( відредагувати ) свою відповідь, щоб покращити її. Наприклад, ваша відповідь не відповідає вимозі "дайте короткий огляд того, ЯК використовувати продукт ...".
Каміль Маціоровський

З веб-сайту: "Впорядковує великий набір файлів чи каталогів з метою використання мінімальної кількості фізичних носіїв (CD, DVD, BD ...). Ви можете перетягувати отримані набори безпосередньо над вашим програмним забезпеченням (Nero, DVD -го ...) ".
Антон

Майже. Для кращої відповіді слід відредагувати відповідь.
Каміль Маціоровський

Я не можу бачити нічого іншого, крім того, що писали автори. Напевно, можна просто зайти на веб-сайт і запитати.
Антон

Це добре. Моя думка, ви повинні редагувати свою відповідь, а не писати коментарі з "розширенням" до неї. Це відповідь, яка повинна відповідати зазначеному контуру, а не відповідати + коментарям. Фрагмент, цитований у коментарі, має бути цитований у вашій відповіді. Це все.
Каміль Маціоровський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.