Wie schneiden Sie einen 1 GB großen Abschnitt aus einer sehr großen Textdatei (98 GB) ab?

534
Catsunami

Ich habe es geschafft, während eines Testes über Nacht eine 98 GB-Protokolldatei zu erstellen. Ich kann mit einer 98 GB-Datei nichts anfangen. Ich wollte es ursprünglich in kleinere Teile schneiden, also habe ich 7-zip ausprobiert, aber ich habe eigentlich nicht mehr genügend Platz auf meiner Festplatte (wahrscheinlich, weil dort jetzt 100 GB-Datei vorhanden ist ...). Ich möchte also nur den 1GB-Teil vom Ende abschneiden. Ist das möglich?

Es ist nur eine Textdatei, die Zeitstempel und danach einige Daten enthält, und es ist mir egal, ob die erste Zeile einer Datei geschnitten oder verstümmelt wird. Alles, was in Windows 10 integriert ist, das ich verwenden kann?

4
Ich glaube nicht, dass es integrierte Lösungen gibt. Sie können jedoch zunächst versuchen, die Auslagerungsdatei in der Größe zu ändern oder hiberfil.sys einfach zu deaktivieren, und Sie haben sofort ein paar GB, um "tail" im Protokoll auszuführen. Danach entfernen Sie einfach die riesige Protokolldatei und passen die Größe der * .sys-Dateien bei Bedarf an. Wenn Sie ein anderes Laufwerk haben, speichern Sie die Ausgabedatei dort phuclv vor 6 Jahren 0
@phuclv, danke. Ich habe Bobs Vorschlag verwendet und anscheinend waren meine Daten innerhalb des ersten GB, der Rest war nur Ausnahmen. Das einzige andere Laufwerk, das ich zur Verfügung habe, ist ein Netzlaufwerk, und das Schreiben von 98 GB, selbst in Brocken, ist ziemlich wild! Catsunami vor 6 Jahren 0
In diesem Fall ist es einfach einfacher, [SetEndOfFile] (https://superuser.com/q/299329/241386) aufzurufen, um die Datei abzuschneiden phuclv vor 6 Jahren 0
@phuclv, ja, es wäre einfacher, wenn ich gewusst hätte, dass ich die 97GB am Ende nicht brauchte. Ich war mir jedoch nicht sicher, wo das Problem lag. Catsunami vor 6 Jahren 0

2 Antworten auf die Frage

2
Bob

Dies ist möglicherweise auch mit integrierten Cmdlets möglich, aber ich würde mich nicht für die Ausführung Get-Contentvon Dateien mit mehr als 100 MB entscheiden. Wenn Sie es versuchen möchten, möchten Sie vielleicht ein Äquivalent fürtail . Ich bin mir nicht sicher, ob sie klug genug sind, um voranzukommen, oder ob sie versuchen, jede Zeile von Anfang an zu lesen und nur die letzten X-Zeilen anzuzeigen. Offensichtlich würde der letztere Ansatz eine Weile dauern, wenn er versuchen würde, 90 GB zu lesen und zu überspringen.

Wenn Sie sich nicht für in Windows integrierte Tools interessieren, glaube ich, dass die tailImplementierung von GNU intelligenter ist. Dies kann von der WSL oder einem der vielen Ports aus ausgeführt werden.

Beim reinen PowerShell / .NET-Skripting werde ich ein früheres PowerShell-Skript anpassen, das zum Aufteilen einer einzelnen großen Datei entwickelt wurde. Dieses Skript wurde für die Verwendung von 4-KB-Blöcken geschrieben, um die Speicherauslastung zu minimieren. Wir können zuerst zum richtigen Ort (einer fast sofortigen Operation) suchen und von dort aus kopieren. Der Einfachheit halber wird keine Analyse für den nächsten / vorherigen Zeilenumbruch durchgeführt. Wir springen einfach zu einem bestimmten Byte (sogar zur Mittellinie).

Wenn Sie es vorziehen, eine bestimmte Entfernung von Anfang an zu suchen, können Sie z. B. $seekLoc = 97GBund ersetzen $seekOrigin = "Begin"und vielleicht $copyLen = 10GBsicher sein und das Ende nicht verpassen.

$inFile = "foo.txt" $outFile = "bar.txt" $seekLoc = -1GB $seekOrigin = "End" $copyLen = 1GB  # need to sync .NET CurrentDirectory with PowerShell CurrentDirectory # https://stackoverflow.com/questions/18862716/current-directory-from-a-dll-invoked-from-powershell-wrong [Environment]::CurrentDirectory = Get-Location # 4k is a fairly typical and 'safe' chunk size # partial chunks are handled below $bytes = New-Object byte[] 4096  $inReader = [System.IO.File]::OpenRead($inFile) $inReader.Seek($seekLoc, $seekOrigin)  # better to use functions but a flag is easier in a simple script $finished = $false  $bytesToRead = $copyLen  # Just like File::OpenWrite except CreateNew instead to prevent overwriting existing files $outWriter = New-Object System.IO.FileStream "$outFile",CreateNew,Write,None  while ($bytesToRead) { # read up to 4k at a time, but no more than the remaining bytes from copyLen $bytesRead = $inReader.Read($bytes, 0, [Math]::Min($bytes.Length, $bytesToRead))  # 0 bytes read means we've reached the end of the input file if (!$bytesRead) { break }  $bytesToRead -= $bytesRead  $outWriter.Write($bytes, 0, $bytesRead) }  # dispose closes the stream and releases locks $outWriter.Dispose()  $inReader.Dispose() 
Danke für den Vorschlag, Bob. Es hat super funktioniert. Die Daten, die ich wollte, waren eigentlich in der ersten GB, der Rest (alle 97 GB) wurde immer wieder mit der gleichen Ausnahme gefüllt (nicht meine Software), bis meine SSD voll war und abgestürzt ist, bevor ich reinkam. Aufregend! Catsunami vor 6 Jahren 0
Beachten Sie, dass dies in eine andere Datei schreibt. Es funktioniert also nicht, wenn nicht genügend 1 GB Speicherplatz zur Verfügung steht. In den meisten Fällen kann der Protokollierungsprozess häufig nicht schreiben, da auf dem Laufwerk kein Speicherplatz mehr vorhanden ist und das Protokoll vor dem Absturz nicht richtig angezeigt wird phuclv vor 6 Jahren 0
@phuclv. Es war genug Platz für ein 1 GB großes Stück. In den meisten Fällen sollte es realistisch sein, etwas Speicherplatz auf der Festplatte freizugeben, in dem ein Chunk gespeichert werden kann. Die Verwendung von "tail", wie Sie vorgeschlagen hatten, erlaubte mir, am Ende einige Zeilen zu sehen, aber ohne zu wissen, wie viele Daten sicher abgeschnitten werden konnten, konnte ich die Datei nicht einfach abschneiden. Catsunami vor 6 Jahren 0
1
harrymc

Ich habe den V-Datei-Viewer verwendet, um solche großen Dateien problemlos anzeigen zu können. Diese Lösung erfordert nicht viel Speicherplatz und der Viewer ist sehr schnell.

Der V-Datei-Viewer ist eine Testversion mit einer Testzeit von 30 Tagen und einem Preis von 20 US-Dollar, der 6 Jahre kostenlose Upgrades beinhaltet. Wenn Sie solche großen Textdateien von Zeit zu Zeit analysieren müssen, ist dies möglicherweise den Preis wert. Ich habe es bezahlt und halte es für eine ausgezeichnete Investition.

image

Danke für den Vorschlag. Ich bevorzuge Lösungen, bei denen ich keine Drittanbieter-Software installieren muss. Daher akzeptiere ich Bobs Antwort. Catsunami vor 6 Jahren 0