2017-03-11 1 views
3

Ich habe eine 370MB Zip-Datei und der Inhalt ist eine 4,2 GB CSV-Datei.R: mögliche Kürzung von> = 4GB Datei

ich getan habe:

unzip("year2015.zip", exdir = "csv_folder") 

Und ich habe diese Nachricht:

1: In unzip("year2015.zip", exdir = "csv_folder") : 
    possible truncation of >= 4GB file 

Haben Sie das zuvor erlebt? Wie hast du es gelöst?

Antwort

3

Ich stimme mit @ Sixiang.Hu Antwort, R unzip() wird nicht zuverlässig mit Dateien größer als 4 GB arbeiten.

Um zu zu bekommen, wie hast du es gelöst?: Ich habe ein paar verschiedene Tricks damit ausprobiert, und nach meiner Erfahrung ist das Ergebnis von allem, das die eingebauten R von R verwendet, (fast) immer eine falsche Identifikation des EOF-Markers vor dem eigentlichen Ende von die Datei.

Ich behandle dieses Problem in einer Reihe von Dateien, die ich auf einer nächtlichen Basis verarbeiten, und um es konsequent und in einer automatisierten Art und Weise zu behandeln, schrieb ich die folgende Funktion wickeln Sie das UNIX unzip. Dies ist im Grunde, was Sie mit System (unzip()) tun, aber gibt Ihnen ein bisschen mehr Flexibilität in seinem Verhalten, und ermöglicht es Ihnen, auf Fehler systematischer zu überprüfen.

decompress_file <- function(directory, file, .file_cache = FALSE) { 

    if (.file_cache == TRUE) { 
     print("decompression skipped") 
    } else { 

     # Set working directory for decompression 
     # simplifies unzip directory location behavior 
     wd <- getwd() 
     setwd(directory) 

     # Run decompression 
     decompression <- 
     system2("unzip", 
       args = c("-o", # include override flag 
         file), 
       stdout = TRUE) 

     # uncomment to delete archive once decompressed 
     # file.remove(file) 

     # Reset working directory 
     setwd(wd); rm(wd) 

     # Test for success criteria 
     # change the search depending on 
     # your implementation 
     if (grepl("Warning message", tail(decompression, 1))) { 
     print(decompression) 
     } 
    } 
}  

Hinweise:

Die Funktion ein paar Dinge tut, die Ich mag und empfehlen:

  • verwendet system2 über System, weil the documentation sagt „system2 ist ein tragbarer und flexible Schnittstelle als System "
  • trennt th e directory und file Argumente, und verschiebt das Arbeitsverzeichnis auf das Argument directory; Je nach System, unzip (oder Ihre Wahl der Entpacker) bekommt Archive außerhalb des Arbeitsverzeichnis
    • es ist nicht rein, aber das Zurücksetzen des Arbeitsverzeichnis ist ein schöner Schritt in Richtung auf die Funktion weniger Nebenwirkungen mit etwa Dekomprimieren
    • wirklich pingelig
    • Sie können es technisch ohne dass dies, aber nach meiner Erfahrung ist es einfacher, die Funktion ausführlicher zu machen, als zu tun haben Dateipfade zu erzeugen und die Erinnerung unzip CLI Flaggen
  • ich es setze die Option -o verwenden, um Überschreibt automatisch, wenn es erneut ausgeführt wird, aber Sie könnten eine beliebige Anzahl von Argumenten
  • angeben
  • enthält ein .file_cache Argument, das Sie Dekompression
    • Das ist praktisch, überspringen können, wenn Sie einen Prozess zu test, die auf der entpackten Datei ausgeführt wird, da 4GB + Dateien sind in der Regel einige Zeit in Anspruch nehmen
  • dekomprimieren
  • in diesem Fall kommentiert, aber wenn Sie wissen, dass Sie nicht das Archiv müssen nach Dekomprimierung, können Sie es inline
  • der system2 Befehl leitet den stdout Dekompression entfernen, um ein Zeichen Vektor
    • eine if + grepl Prüfung am Ende sieht für Warnungen im stdout und druckt die stdout, wenn es, dass die Expression
5

?unzip prüfen, fanden den folgenden Kommentar in Note:

Es gewisse Unterstützung für bzip2 keine Komprimierung und> 2 GB Zip-Dateien (aber nicht> = 4 GB Dateien Vorverdichtung in einer ZIP-Datei enthalten: wie viele Builds von entpacken, kann es diese abschneiden, in R Fall mit einer Warnung wenn möglich).

Sie können versuchen, es außerhalb von R zu entpacken (z. B. mit 7-Zip).

+0

I 7-Zip verwenden musste findet dies selbst zu tun. – sconfluentus