Dienstprogramm zur optimalen Verteilung von Dateien auf mehrere DVDs?

4166
Alex R

Ich habe eine Reihe von Mediendateien, die ich auf DVD aufnehmen möchte, aber da jede DVD nur 4,5 GB groß ist, muss ich den optimalen Weg finden, um die Dateien so zu organisieren, dass nur die minimale Anzahl von DVDs verwendet wird (sonst bleibt der leere Speicherplatz übrig.) DVD kann leicht addieren). Gibt es irgendwelche Hilfsmittel, um dabei zu helfen?

Vor vielen Jahren gab es ein DOS-Programm, um dies mit Disketten zu tun.

10
Nein, ich suche nicht nach Kompression und Aufteilung. Ich möchte die Dateien nativ verteilen (Dateisystem), so dass jede Platte direkt verwendet werden kann. Alex R vor 14 Jahren 1
Ich hatte nur das Gefühl, dass dies eine gute Seite für alle ist, die suchen: http://www.howtogeek.com/76264/how-to-burn-data-across-multiple-dvd-or-cd-discs/ Nav vor 10 Jahren 0

7 Antworten auf die Frage

2
harrymc

Probieren Sie den kostenlosen DVD Span aus :

DVD Span ist ein Backup-Tool zum Schreiben des Inhalts großer Ordner auf mehrere DVDs. DVD Span kann automatisch die beste Organisation jeder Festplatte ermitteln, um die maximale Datenmenge auf die Mindestanzahl der Festplatten zu übertragen. DVDSpan ist ein großartiges Werkzeug, um Ihre Musiksammlung, Fotos oder sogar Ihre gesamte Festplatte auf DVDs zu sichern. Und da normale DVDs (oder CDs) produziert werden, ist keine spezielle Software erforderlich, um Ihre Sicherungen zu lesen oder wiederherzustellen.

2
Jeff Shattock

Ah, das Rucksackproblem . Ich konnte hier nur einen Online-Löser finden . Ihre Rucksackgröße wäre 4,5 GB, und jedes Paket wäre Ihre Dateigröße. Sie müssen die Ausgabe ein wenig massieren, um zu Ihrer speziellen Anwendung zu passen, aber es sollte funktionieren. Dies wird jedoch nicht sehr schnell laufen, da dieses Problem schwer ist .

Ja, es ist ein NP-komplettes Problem, aber für diese praktische Anwendung ist eine Brute-Force-Lösung schnell genug :) Alex R vor 14 Jahren 0
Dies ist nicht gleichbedeutend mit dem Rucksack-Problem, sondern mit dem (1-D) [Bin-Packing-Problem] (http://en.wikipedia.org/wiki/Bin_packing_problem), von dem es [einen genauen Algorithmus] gibt (http: / /en.wikipedia.org/wiki/Bin_packing_problem#Exact_algorithm). Kenny Evitt vor 9 Jahren 1
2
Kenny Evitt

Überblick

Jeff Shattocks Antwort ist richtig, dass dies einem kombinatorischen Optimierungsproblem entspricht (oder isomorph, wie es Mathematiker schreiben), aber es entspricht dem 1-dimensionalen Bin-Pack-Problem, nicht dem Rucksack-Problem .

Zum Glück habe ich etwas Code, den Sie teilen können, um dieses Problem für Sie oder andere Personen zu lösen, die Zugriff auf einen Windows-Computer haben, auf dem mindestens die Version 3.5 von .NET Framework installiert ist.

Eine grobe Lösung

  1. Laden Sie zunächst LINQPad herunter und installieren Sie es .

  2. Zweitens laden Sie die gerade geschriebene LINQPad-Abfrage herunter - hier ist der Linq (ha) der Rohdatei. Speichern Sie es als .linq- Datei und öffnen Sie es in LINQPad.

  3. Ändern Sie die Parameter:

    Hier ist der Teil im LINQPad-Abfragecode, den Sie ändern sollten:

    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";

    Ändern Sie binSizeMbdie Größe Ihrer "Ablage", z. B. CD, DVD, z. int binSizeMb = 650;für eine CD.

    Hinweis - Der binSizeMbWert wird als das interpretiert, was manchmal als Mebibyte bezeichnet wird . Im Gegensatz zu meiner Kindheit, wenn alle Byte-Multiples "binär" waren, bezieht sich "MB" manchmal auf ein dezimales Megabyte oder genau 1.000.000 Byte, im Gegensatz zu den 1.048.576 Byte eines Mebibytes (MiB), das in meinem Code verwendet wird . Wenn Sie dies ändern möchten, ändern Sie die Zeile const int bytesPerMb = 1048576;im Code in const int bytesPerMb = 1000000;.

    Wechseln Sie rootFileFolderPathzum vollständigen Pfad des Ordners, der die Dateien enthält, die Sie in Ablagen packen möchten, z. string rootFileFolderPath = @"C:\MySecretBinFilesFolder";.

  4. Führen Sie die Abfrage aus, indem Sie entweder oben links auf der Registerkarte "Abfrage" F5auf die Schaltfläche Ausführen klicken oder darauf klicken .

Ergebnisse

Der Abfragecode listet alle Dateien im rootFileFolderPathOrdner rekursiv auf, das heißt, er enthält auch Dateien in allen Unterordnern.

Dann werden 'Bins' für die Dateien erstellt, so dass die Gesamtgröße aller Dateien in jedem Bin kleiner oder gleich der angegebenen Bin-Größe ist.

Im LINQPad-Ergebnisbereich sehen Sie zwei Listen.

Die erste Liste enthält alle gefundenen Dateien. Sie werden in absteigender Reihenfolge nach Größe aufgelistet.

Die zweite Liste enthält die durch "Packen der Dateien" erstellten Ablagen mit einer Liste der Dateien und deren Größe sowie der verbleibenden Größe der Ablage.

Hier ist ein Screenshot mit der zweiten Liste und den ersten beiden erstellten Behältern:

LINQPad screenshot showing list of bins

Cursor-Analyse

Laut Wikipedia sollte der von mir verwendete Algorithmus - die First Fit Decreasing (FFD) -Strategie - nicht zu schlecht sein; Wikipedia sagt:

Im Jahr 2007 wurde bewiesen, dass der gebundene 11/9 OPT + 6/9 für FFD eng ist.

„OPT“ bezieht sich auf die optimale Strategie (als etwas Unerreichbares, nicht als bestimmte Strategie).

Aufgrund meiner etwas unscharfen Erinnerungen an die mathematischen Ausdrücke sollte dies bedeuten, dass die FFD-Strategie im schlechtesten Fall die ~ 1,22-fache Anzahl von Behältern in eine optimale Strategie packen sollte. Daher könnte diese Strategie die Artikel in fünf anstelle von vier Fächern einpacken. Ich vermute, dass die Leistung wahrscheinlich sehr nahe am Optimum liegt, außer bei bestimmten pathologischen Artikelgrößen.

Der gleiche Wikipedia-Artikel besagt auch, dass es einen "exakten Algorithmus" gibt . Ich kann beschließen, das auch zu implementieren. Ich muss zuerst den Artikel lesen, der den Algorithmus beschreibt.

0
Journeyman Geek

Sie könnten ein beliebiges Komprimierungswerkzeug verwenden, das das Aufteilen eines Archivs ermöglicht

Ich suche nicht nach Kompression. Dies macht es zu umständlich, auf die Dateien zuzugreifen. Alex R vor 14 Jahren 1
0
imz -- Ivan Zakharyaschev

Sie können eine der Varianten des Programms im Handbuch von Hitchhiker zu Haskell bringen, vielleicht nachdem Sie einen Teil des Tutorials durchgearbeitet haben; Das Tutorial ist so geschrieben, dass Sie genau das Problem lösen, Dinge auf mehrere Platten zu verteilen, wobei die Lösung schrittweise verfeinert wird, wie in der folgenden Passage aus Kapitel 3 des Tutorials veranschaulicht :

Schon genug Vorräte. Lass uns ein paar CDs packen.

Wie Sie vielleicht schon erkannt haben, ist unser Problem ein klassisches. Es wird als "Rucksackproblem" bezeichnet ( google it up, wenn Sie nicht bereits wissen, was es ist. Es gibt mehr als 100000 Links).

Beginnen wir mit der gierigen Lösung ...

Weitere Ideen: eine verwandte Frage

Hier ist eine ähnliche Frage (wenn auch nicht die gleiche: Es wird dort nicht nach Optimierung gefragt), in der Sie möglicherweise weitere nützliche Lösungen / Programme für Ihre Aufgabe finden (falls diese veröffentlicht werden):

Einige Hinweise zum Verständnis der Programmierung im vorgeschlagenen Tutorial

Im Allgemeinen ist der Haskell-Code ziemlich ausdrucksvoll (da Haskell eine Programmiersprache auf hohem Abstraktionsniveau ist) und kann daher leicht verstanden werden.

Wenn Sie sich den Code einer der Lösungen anschauen, denken Sie daran, dass die Struktur der obersten Ebene des Programms, das wir schreiben möchten, recht einfach ist, wie in Kapitel 1 des Lernprogramms beschrieben:

Lassen Sie uns einen Moment darüber nachdenken, wie unser Programm funktionieren wird, und es in Pseudocode ausdrücken:

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

Klingt vernünftig? Ich dachte auch.

Lassen Sie uns unser Leben ein wenig vereinfachen und gehen Sie jetzt davon aus, dass wir die Verzeichnisgrößen außerhalb unseres Programms (z. B. mit " du -sb *") berechnen und diese Informationen aus stdin lesen.

und schauen Sie sich die Teile der Lösung genauer an.

0
Marcin Orlowski

Vor langer Zeit schrieb ich ein PHP-Skript, um diese Aufgabe zu erledigen: https://bitbucket.org/borszczuk/php-backup-maker/

0
Anton

Probieren Sie auch Discfit aus, das Dateien und Verzeichnisse auswählt, die auf verschiedene Festplatten kopiert werden sollen:

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

Eine Antwort nur mit Link ist keine gute Antwort. Wenn Sie Software empfehlen, befolgen Sie bitte [diese Übersicht] (http://meta.superuser.com/a/5330/432690). Sie sollten Ihre Antwort erweitern ([edit] (http://superuser.com/posts/1113099/edit)), um sie zu verbessern. Ihre Antwort entspricht beispielsweise nicht der Anforderung "Geben Sie einen kurzen Überblick über die Verwendung des Produkts. Kamil Maciorowski vor 7 Jahren 0
Von der Website: "Ordnet eine große Anzahl von Dateien oder Verzeichnissen an, um die minimale Anzahl von physischen Medien (CD, DVD, BD ...) zu verwenden. Sie können die resultierenden Sätze direkt über Ihre Brennsoftware (Nero, DVD) ziehen -gehen...)". Anton vor 7 Jahren 0
Fast. Um die Antwort zu verbessern, sollten Sie die Antwort bearbeiten. Kamil Maciorowski vor 7 Jahren 0
Ich kann nichts anderes hinzufügen als das, was die Autoren geschrieben haben. Man kann wahrscheinlich nur auf die Website gehen und nachfragen. Anton vor 7 Jahren 0
Kein Problem. Mein Punkt ist, Sie sollten Ihre Antwort [bearbeiten] (http://superuser.com/a/1113099/432690), nicht Kommentar mit "Erweiterung" schreiben. Es ist die Antwort, die der besagten Gliederung folgen sollte, nicht die Antwort + Kommentare. Das in Kommentar zitierte Fragment sollte in Ihrer Antwort zitiert werden. Das ist alles. Kamil Maciorowski vor 7 Jahren 0