Angenommen, Sie haben zwei große Dateien (mehrere GB), die Sie verketten wollen, aber Sie haben sehr wenig freien Speicherplatz (sagen wir ein paar hundert MB). Das heißt, wenn Sie file1
und file2
angeben, möchten Sie mit einer einzelnen Datei enden, die das Ergebnis der byteweisen Verknüpfung von file1
und file2
ist, und das Löschen der Originaldateien.
Sie können das offensichtliche cat file2 >> file1; rm file2
nicht tun, da zwischen den beiden Operationen kein Speicherplatz mehr zur Verfügung steht.
Lösungen auf allen Plattformen mit kostenlosen oder nicht-kostenlosen Tools sind willkommen; Dies ist ein hypothetisches Problem, das ich mir ausgedacht habe, als ich ein Linux-ISO neulich heruntergeladen habe, und der Download wurde wegen eines kabellosen Schluckaufs unterbrochen.
Ich denke, die Schwierigkeit besteht darin zu bestimmen, wie der Speicherplatz aus den Originaldateien wiederhergestellt werden kann.
Ich denke, das Folgende könnte funktionieren:
Dies alles basiert auf der Unterstützung von Sparse-Dateien und der Dateikürzung, die Speicherplatz sofort freigibt.
Wenn Sie das wirklich tun wollten, sollten Sie den Befehl dd
untersuchen. welches den Kopierschritt machen kann
Jemand in einer anderen Antwort gab eine ordentliche Lösung, die keine Sparse-Dateien benötigt, sondern kopiert Datei2 zweimal:
Zeit, die Sie damit verbracht haben, clevere Lösungen zu finden, die das Verschieben von Festplatten-Sektoren und die Manipulation von Datei-Ketten beinhalten: 2-4 Stunden
Zeit für den Erwerb / das Schreiben von Software für die direkte Kopie und das Abschneiden: 2-20 Stunden
mal Median $ 50 / hr Programmierer Rate: $ 400- $ 1200
Kosten von 1 TB USB-Laufwerk: $ 100- $ 200
Fähigkeit, den Ausdruck "Opportunitätskosten" zu verstehen: unbezahlbar
Hier ist eine kleine Verbesserung gegenüber meinem erste Antwort .
Wenn Sie 100 MB frei haben, kopieren Sie die letzten 100 MB aus der zweiten Datei und erstellen Sie eine dritte Datei. Kürzen Sie die zweite Datei so, dass sie jetzt 100 MB kleiner ist. Wiederholen Sie diesen Vorgang, bis die zweite Datei vollständig in einzelne 100 MB Chunks zerlegt wurde.
Nun kann jede dieser 100 MB-Dateien einzeln an die erste Datei angehängt werden.
Mit diesen Einschränkungen erwarte ich, dass Sie das Dateisystem manipulieren müssen; Bearbeiten Sie direkt die Dateigröße und Zuweisungsblöcke.
Mit anderen Worten: Vergessen Sie nicht, Blöcke von Dateiinhalten zu mischen, sondern bearbeiten Sie einfach die Informationen über diese Dateien.
Haben Sie die Möglichkeit, einfach eine größere Festplatte zu bekommen, auf die Gefahr hin, leichtfertig zu klingen? Es wäre wahrscheinlich schneller ...
Nicht sehr effizient, aber ich denke, dass es getan werden kann.
Öffnen Sie die erste Datei im Append-Modus, und kopieren Sie Blöcke aus der zweiten Datei, bis die Platte fast voll ist. Kopieren Sie für den Rest der zweiten Datei Blöcke von dem Punkt, an dem Sie über zufällige Zugriffsperipherie an den Anfang der Datei angehalten haben. Schneiden Sie die Datei ab, nachdem Sie den letzten Block kopiert haben. Wiederholen bis zum Ende.
Offensichtlich ist die wirtschaftliche Antwort, mehr Speicher zu kaufen, vorausgesetzt, das ist eine mögliche Antwort. Es könnte jedoch nicht sein - Embedded System ohne Möglichkeit, mehr Speicher anzubringen, oder sogar keinen Zugriff auf das Gerät selbst - sagen, Raumsonde im Flug.
Die zuvor vorgestellte Antwort basierend auf dem Sparse-Dateisystem ist gut (abgesehen von der zerstörerischen Natur, wenn etwas schief geht!), wenn Sie ein Sparse-Dateisystem haben. Was, wenn du es nicht tust?
Ab dem Ende von Datei 2 kopieren Sie die Blöcke an den Anfang der Zieldatei und kehren sie so um, wie Sie vorgehen. Nach jedem Block schneiden Sie die Quelldatei auf die nicht kopierte Länge ab. Wiederholen Sie für Datei # 1.
An dieser Stelle enthält die Zieldatei alle Daten rückwärts, die Quelldateien sind weg.
Lesen Sie einen Block von der Torte und vom Ende der Zieldatei, kehren Sie sie um und schreiben Sie sie an die Stelle, von der die andere kam. Arbeite dich nach innen und blicke Blöcke.
Wenn Sie fertig sind, ist die Zieldatei die Verkettung der Quelldateien. Es wird kein dünnes Dateisystem benötigt, kein Durcheinander mit dem benötigten Dateisystem. Dies kann frei von null Bytes ausgeführt werden, da die Daten im Speicher gehalten werden können.
ok, für theoretische Unterhaltung, und nur, wenn Sie versprechen, Ihre Zeit damit zu verschwenden, es tatsächlich zu tun:
So können Sie die Dateien verketten mit:
Dies wäre optimal effizient: minimale Änderungen, minimales Kopieren, kein Platz auf der Festplatte erforderlich.
gehen Sie jetzt kaufen ein USB-Laufwerk; -)
Zwei Gedanken:
Wenn Sie genug physischen RAM haben, könnten Sie tatsächlich die zweite Datei vollständig in den Speicher lesen, löschen und dann im Append-Modus in die erste Datei schreiben. Natürlich, wenn Sie nach dem Löschen Strom verlieren, aber bevor Sie den Schreibvorgang abgeschlossen haben, haben Sie einen Teil der zweiten Datei für immer verloren.
Verringern Sie vorübergehend den Speicherplatz, der von den Betriebssystemfunktionen verwendet wird (z. B. virtueller Speicher, "Papierkorb" oder Ähnliches). Wahrscheinlich nur von Nutzen für Windows.
Ich bezweifle, dass dies eine direkte Antwort auf die Frage ist. Sie können dies als eine alternative Möglichkeit zur Lösung des Problems betrachten.
Ich denke, es ist möglich, die zweite Datei als Teil 2 der ersten Datei zu betrachten. Normalerweise würden wir in einer Zip-Anwendung sehen, dass eine riesige Datei in mehrere Teile aufgeteilt ist. Wenn Sie den ersten Teil öffnen, berücksichtigt die Anwendung automatisch die anderen Teile in der weiteren Verarbeitung.
Wir können das Gleiche hier simulieren. Wie @edg herausfand, wäre das Basteln von Dateisystemen eine Möglichkeit.
Sie können möglicherweise Speicherplatz gewinnen, indem Sie das gesamte Dateisystem komprimieren. Ich glaube, NTFS unterstützt dies, und ich bin mir sicher, dass es Varianten von * nix-Dateisystemen gibt, die es unterstützen würden. Es hätte auch den Vorteil, dass nach dem Kopieren der Dateien immer noch mehr Speicherplatz übrig bleibt als beim Start.
OK, das Problem ein wenig geändert. Vermutlich gibt es andere Dinge auf der Festplatte, die Sie nicht brauchen, aber Sie wissen nicht, was es ist oder wo es ist. Wenn Sie es finden könnten, könnten Sie es löschen, und dann hätten Sie vielleicht genug zusätzlichen Platz.
Um diese "Tumore" zu finden, ob ein paar große oder viele kleine, benutze ich ein kleines Probenprogramm. Beginnend von der Spitze eines Verzeichnisses (oder der Wurzel) führt es zwei Durchgänge aus. In Durchlauf 1 durchläuft es den Verzeichnisbaum und addiert die Größe aller Dateien, um insgesamt N Bytes zu erhalten. In Pass 2 geht es erneut durch den Verzeichnisbaum und gibt vor, dass jede Datei gelesen wird. Jedes Mal, wenn es N / 20 Bytes übergibt, gibt es den Verzeichnispfad und den Namen der Datei aus, die es "liest". Das Endergebnis sind also 20 tiefe Samples von Pfadnamen, die gleichmäßig auf alle Bytes unter dem Verzeichnis verteilt sind.
Dann sieh dir die Liste an, wenn du so viele Dinge siehst, die du nicht brauchst, und gehe sie weg.
(Es ist das Leerzeichen-Äquivalent der Sampling-Methode, die ich für die Leistungsoptimierung verwende.)
Tags und Links filesystems large-files concatenation