Wie können Sie zwei riesige Dateien mit sehr wenig freiem Speicherplatz verketten? [geschlossen]

8

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.

    
Adam Rosenfield 14.11.2008, 16:43
quelle

15 Antworten

8

Ich denke, die Schwierigkeit besteht darin zu bestimmen, wie der Speicherplatz aus den Originaldateien wiederhergestellt werden kann.

Ich denke, das Folgende könnte funktionieren:

  1. Ordne eine dünn besetzte Datei der kombinierte Größe.
  2. Kopieren Sie 100 MB vom Ende der zweiten Datei an das Ende der neuen Datei.
  3. Schneiden Sie 100 MB des Endes der zweiten Datei ab
  4. Schleife 2 und 3, bis die zweite Datei fertig ist (mit 2. an die richtige Stelle in der Zieldatei geändert).
  5. Do 2 & amp; 3 & amp; 4 aber mit der ersten Datei.

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:

  1. Kopieren Sie 100 MB-Chunks vom Ende der Datei 2 in eine neue Datei 3, die in umgekehrter Reihenfolge endet. Abschneiden von Datei 2, wie Sie gehen.
  2. Kopieren Sie 100 MB-Chunks vom Ende der Datei 3 in die Datei 1, und enden Sie mit den Chunks in der ursprünglichen Reihenfolge am Ende der Datei 1. Schneiden Sie die Datei 3 ab, während Sie fortfahren.
Douglas Leeder 14.11.2008, 16:59
quelle
15

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

    
Steven A. Lowe 14.11.2008 17:23
quelle
6

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.

    
Mark Ransom 14.11.2008 17:56
quelle
4

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.

    
Ed Guiness 14.11.2008 16:53
quelle
2

Wenn die Datei stark komprimierbar ist (dh Logs):

%Vor%     
Marcin 24.07.2009 23:04
quelle
1

Haben Sie die Möglichkeit, einfach eine größere Festplatte zu bekommen, auf die Gefahr hin, leichtfertig zu klingen? Es wäre wahrscheinlich schneller ...

    
David Arno 14.11.2008 17:01
quelle
1

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.

    
Mark Ransom 14.11.2008 17:30
quelle
1

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.

    
Loren Pechtel 14.11.2008 17:45
quelle
1

ok, für theoretische Unterhaltung, und nur, wenn Sie versprechen, Ihre Zeit damit zu verschwenden, es tatsächlich zu tun:

  • -Dateien werden in Stücken auf der Festplatte gespeichert
  • die Stücke sind in einer Kette verknüpft

So können Sie die Dateien verketten mit:

  • Verknüpft das letzte Stück der ersten Datei mit dem ersten Stück der letzten Datei
  • Ändern des Verzeichniseintrags für die erste Datei, um das letzte Stück und die letzte Dateigröße zu ändern
  • Entfernen des Verzeichniseintrags für die letzte Datei
  • bereinigt den Dateiende-Marker der ersten Datei, falls vorhanden
  • Beachten Sie, dass, wenn das letzte Segment der ersten Datei nur teilweise gefüllt ist, Sie Daten "up" die Segmente der letzten Datei kopieren müssen, um Müll in der Mitte der Datei zu vermeiden [danke @Wedge!]

Dies wäre optimal effizient: minimale Änderungen, minimales Kopieren, kein Platz auf der Festplatte erforderlich.

gehen Sie jetzt kaufen ein USB-Laufwerk; -)

    
Steven A. Lowe 14.11.2008 17:30
quelle
0

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.

    
Dave Costa 14.11.2008 17:10
quelle
0

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.

    
rpattabi 14.11.2008 17:12
quelle
0

Sie könnten dies tun:

%Vor%

Sie können 1024 erhöhen, je nachdem, wie viel zusätzlicher Speicherplatz Sie haben, und wiederholen Sie dies dann, bis alle Bytes verschoben wurden.

Dies ist wahrscheinlich der schnellste Weg (in Bezug auf die Entwicklungszeit)

    
luke 14.11.2008 21:19
quelle
0

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.

    
grieve 14.11.2008 21:36
quelle
0

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.)

    
Mike Dunlavey 19.11.2008 04:33
quelle
-1

"fiemap"

Ссылка

    
Elmer Fudd 03.02.2010 03:07
quelle