Dienstprogramm zur optimalen Verteilung von Dateien auf mehrere DVDs?


11

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 die minimale Anzahl von DVDs verwendet wird (andernfalls der jeweils verbleibende leere Speicherplatz DVD kann sich leicht summieren). Gibt es irgendwelche Tools, die dabei helfen?

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


1
Nein, ich suche keine Komprimierung und Aufteilung. Ich möchte die Dateien nativ (Dateisystem) verteilen, damit jede Festplatte direkt verwendet werden kann.
Alex R

Antworten:


3

Probieren Sie die kostenlose DVD Span :

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 minimale Anzahl von Festplatten abzustimmen. DVDSpan ist ein großartiges Tool zum Sichern Ihrer Musiksammlung, Fotos oder sogar Ihrer gesamten Festplatte auf DVDs. Und da normale DVDs (oder CDs) erstellt werden, ist keine spezielle Software erforderlich, um Ihre Backups zu lesen oder wiederherzustellen.


2

Ah, das Rucksackproblem . Ich konnte hier nur einen Online-Löser dafür 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 sie an Ihre spezielle Anwendung anzupassen, aber sie sollte funktionsfähig sein. Dies wird jedoch nicht sehr schnell laufen, da dieses Problem schwierig ist .


Ja, es ist in der Tat ein NP-vollständiges Problem, aber für diese praktische Anwendung ist eine Brute-Force-Lösung schnell genug :)
Alex R

1
Dies entspricht nicht dem Rucksackproblem, sondern dem (1-D) Behälterpackungsproblem , für das es einen genauen Algorithmus gibt .
Kenny Evitt

2

Überblick

Jeff Shattocks Antwort ist richtig, dass dies einem kombinatorischen Optimierungsproblem entspricht (oder isomorph ist, wie Mathematiker schreiben), aber es entspricht dem Problem der eindimensionalen Behälterverpackung , nicht dem Rucksackproblem .

Zum Glück muss ich Code freigeben, der dieses Problem für Sie oder andere Personen mit Zugriff auf einen Windows-Computer mit mindestens Version 3.5 von .NET Framework löst.

Eine grobe Lösung

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

  2. Laden Sie zweitens die LINQPad-Abfrage herunter, die ich gerade geschrieben habe - hier ist der Linq (ha) zur 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 Ihres 'Fachs', 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, als alle Byte-Vielfachen "binär" waren, bezieht sich "MB" manchmal auf ein "dezimales Megabyte" oder genau 1.000.000 Bytes, im Gegensatz zu den 1.048.576 Bytes eines Mebibytes (MiB), die in meinem Code verwendet werden . Wenn Sie dies ändern möchten, ändern Sie die Zeile const int bytesPerMb = 1048576;im Code in const int bytesPerMb = 1000000;.

    Wechseln Sie rootFileFolderPathin den vollständigen Pfad des Ordners mit den Dateien, die Sie in Bins packen möchten, z. string rootFileFolderPath = @"C:\MySecretBinFilesFolder";.

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

Ergebnisse

Der Abfragecode listet rootFileFolderPathrekursiv alle Dateien im Ordner auf, dh er enthält auch Dateien in allen Unterordnern.

Anschließend werden "Bins" für die Dateien erstellt, sodass die Gesamtgröße aller Dateien in jedem Bin kleiner oder gleich der angegebenen Bin-Größe ist.

Im LINQPad-Ergebnisbereich werden zwei Listen angezeigt.

Die erste Liste enthält alle gefundenen Dateien, die in absteigender Reihenfolge nach Größe aufgelistet sind.

Die zweite Liste enthält die durch "Packen der Dateien" erstellten Fächer mit einer Liste der Dateien und ihrer Größe sowie der verbleibenden Größe des Fachs.

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

LINQPad-Screenshot mit Liste der Fächer

Flüchtige Analyse

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

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

'OPT' bezieht sich auf die optimale Strategie (als etwas, das möglicherweise nicht erreichbar ist, nicht als eine bestimmte tatsächliche Strategie).

Basierend auf meinen etwas unscharfen Erinnerungen an die beteiligten mathematischen Begriffe sollte dies bedeuten, dass die FFD-Strategie im schlimmsten Fall Elemente in das 1,22-fache der Anzahl von Behältern packen sollte, die eine optimale Strategie bieten würde. Diese Strategie könnte also Artikel in 5 statt in 4 Fächer packen. Ich vermute, dass die Leistung mit Ausnahme bestimmter „pathologischer“ Artikelgrößen wahrscheinlich nahezu optimal ist.

Der gleiche Wikipedia-Artikel besagt auch, dass es einen "exakten Algorithmus" gibt . Ich kann mich auch dafür entscheiden, dies umzusetzen. Ich muss zuerst das Papier lesen, das den Algorithmus beschreibt.


0

Sie können jedes Komprimierungswerkzeug verwenden, das das Aufteilen eines Archivs ermöglicht, denke ich


1
Komprimierung ist nicht das, wonach ich suche. Das macht es zu umständlich, auf die Dateien zuzugreifen.
Alex R

0

Sie können eine der Varianten des Programms in Hitchhikers Leitfaden für Haskell übernehmen , möglicherweise nachdem Sie einen Teil dieses Tutorials durchgearbeitet haben. Das Tutorial befasst sich mit der Lösung genau Ihres Problems, Dinge auf mehrere Festplatten zu verteilen, wobei die Lösung schrittweise verfeinert wird, wie in der folgenden Passage aus Kapitel 3 des Tutorials veranschaulicht :

Genug Vorbereitungen schon. Lass uns ein paar CDs packen.

Wie Sie vielleicht bereits erkannt haben, ist unser Problem ein klassisches. Es wird als "Rucksackproblem" bezeichnet ( googeln Sie es , wenn Sie noch nicht 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 (obwohl nicht dieselbe: Sie wird dort nicht zur Optimierung gestellt), wo Sie möglicherweise nützlichere Lösungen / Programme für Ihre Aufgabe finden (falls sie veröffentlicht werden):

  • /unix//q/10158/4319 - "Aufteilen eines großen Verzeichnisbaums in Blöcke mit angegebener Größe?"

Einige Hinweise zum Verständnis der Programmierung finden Sie im vorgeschlagenen Lernprogramm

Im Allgemeinen ist der Haskell-Code sehr ausdrucksstark (da Haskell eine Programmiersprache auf einem hohen Abstraktionsniveau ist) und kann daher leicht verstanden werden.

Denken Sie beim Betrachten des Codes einer der Lösungen daran, dass die Struktur des Programms, das wir auf oberster Ebene schreiben möchten, recht einfach ist, wie in Kapitel 1 des Lernprogramms beschrieben:

Lassen Sie uns nun einen Moment darüber nachdenken, wie unser Programm funktionieren wird, und es im 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 davon ausgehen, dass wir die Verzeichnisgrößen irgendwo außerhalb unseres Programms berechnen (zum Beispiel mit " du -sb *") und diese Informationen von stdin lesen.

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



0

Versuchen Sie auch Discfit, mit dem Dateien und Verzeichnisse ausgewählt werden, die auf verschiedene Festplatten kopiert werden sollen:

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


Eine Antwort nur mit Link ist keine gute Antwort. Befolgen Sie diese Empfehlungen, wenn Sie Software empfehlen . Sie sollten Ihre Antwort erweitern ( bearbeiten ), um sie besser zu machen. Zum Beispiel entspricht Ihre Antwort nicht der Anforderung "Geben Sie einen kurzen Überblick über die Verwendung des Produkts ...".
Kamil Maciorowski

Von der Website: "Ordnet eine große Anzahl von Dateien oder Verzeichnissen an, um die minimale Anzahl von Phisycal-Medien (CD, DVD, BD ...) zu verwenden. Sie können die resultierenden Sätze direkt über Ihre Brennsoftware (Nero, DVD) ziehen -gehen...)".
Anton

Fast. Um die Antwort besser zu machen, sollten Sie die Antwort bearbeiten.
Kamil Maciorowski

Ich kann nichts anderes sehen, als das, was die Autoren geschrieben haben. Man kann wahrscheinlich einfach auf die Website gehen und sich erkundigen.
Anton

Das ist ok. Mein Punkt ist, dass Sie Ihre Antwort bearbeiten und keinen Kommentar mit "Erweiterung" schreiben sollten . Es ist die Antwort, die der genannten Gliederung folgen sollte, nicht Antwort + Kommentare. Das im Kommentar zitierte Fragment sollte in Ihrer Antwort zitiert werden. Das ist alles.
Kamil Maciorowski
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.