Manipulation von großen Dateien in R

8

Ich habe 15 Dateien mit je 4,5 GB. Jede Datei enthält Daten von mehreren Monaten für ungefähr 17.000 Kunden. Insgesamt repräsentieren die Daten Informationen über 17.000 Kunden im Laufe von 15 Monaten. Ich möchte diese Daten neu formatieren, so dass ich anstelle von 15 Dateien, die jeweils einen Monat anzeigen, 17.000 Dateien für jeden Kunden und alle seine Daten habe. Ich habe ein Skript geschrieben, um dies zu tun:

%Vor%

Das Skript funktioniert (zumindest bin ich mir ziemlich sicher). Das Problem ist, dass es unglaublich langsam ist. Bei der Rate, die ich gehe, wird es eine Woche oder länger dauern, bis ich fertig bin, und ich habe diese Zeit nicht. Machen Sie einen besseren, schnelleren Weg, dies in R zu tun? Soll ich das in etwas wie SQL versuchen? Ich habe SQL vorher noch nie wirklich benutzt; Könntest du mir zeigen, wie so etwas gemacht wird? Jede Eingabe wird sehr geschätzt.

    
Ore M 12.04.2015, 18:43
quelle

2 Antworten

16

Als @Dominic Comtois würde ich auch empfehlen, SQL zu verwenden.
R kann ziemlich große Daten verarbeiten - es gibt einen schönen Benchmark von 2 Milliarden Zeilen, der Python schlägt - aber weil R meistens im Speicher läuft, braucht man einen guten Rechner, damit es funktioniert. Ihr Fall muss nicht mehr als 4,5 GB Datei auf einmal laden, so dass es auf dem PC gut machbar sein sollte, siehe zweiten Ansatz für schnelle Nicht-Datenbank-Lösung.
Sie können R verwenden, um Daten in die SQL-Datenbank zu laden und später von der Datenbank abzufragen. Wenn Sie SQL nicht kennen, können Sie eine einfache Datenbank verwenden. Der einfachste Weg von R ist die Verwendung von RSQLite (leider ist es seit v1.1 nicht mehr lite ). Sie müssen keine externe Abhängigkeit installieren oder verwalten. Das RSQLite-Paket enthält das eingebettete Datenbankmodul.

%Vor%

Das ist alles. Sie verwenden SQL, ohne wirklich viel Aufwand zu verursachen, der normalerweise mit Datenbanken zusammenhängt.

Wenn Sie es vorziehen, mit dem Ansatz Ihres Posts zu arbeiten, können Sie, glaube ich, dramatisch beschleunigen, indem Sie write.csv nach Gruppen ausführen, während Sie in data.table aggregieren.

%Vor%

Sie verwenden also fast unique aus data.table und führen das Subsetting durch, während das Gruppieren ebenfalls sehr schnell ist. Unten ist ein funktionierendes Beispiel für den Ansatz.

%Vor%

Update 2016-12-05:
Ausgehend von data.table 1.9.8+ können Sie write.csv durch fwrite ersetzen, zum Beispiel in diese Antwort .

    
jangorecki 12.04.2015, 20:23
quelle
5

Ich denke, du hast bereits deine Antwort. Aber um es zu verstärken, siehe das offizielle Dokument

R Data Import Export

Das sagt

  

Im Allgemeinen sind statistische Systeme wie R nicht besonders gut   geeignet für Manipulationen von großen Datenmengen. Einige andere Systeme sind   besser als R bei diesem, und ein Teil des Stoßes dieses Handbuchs ist zu   schlagen vor, dass, anstatt die Funktionalität in R zu kopieren, wir machen können   ein anderes System macht die Arbeit! (Zum Beispiel Therneau und Gramschsch (2000)   kommentiert, dass sie es vorzogen, Daten in SAS und dann zu manipulieren   Verwenden Sie das Paketüberleben in S für die Analyse.) Datenbankmanipulation   Systeme sind oft sehr gut zum Manipulieren und Extrahieren von Daten geeignet:   Mehrere Pakete zur Interaktion mit DBMS werden hier besprochen.

Die Speicherung massiver Daten ist also nicht die primäre Stärke von R, bietet aber Schnittstellen zu mehreren darauf spezialisierten Tools. In meiner eigenen Arbeit reicht die leichtgewichtige SQLite-Lösung aus, auch wenn es in gewissem Maße eine Frage der Präferenz ist. Suchen Sie nach "Nachteile der Verwendung von SQLite" und Sie werden wahrscheinlich nicht viel finden, um Sie davon abzubringen.

Sie sollten die SQLite-Dokumentation ziemlich problemlos finden. Wenn Sie genug Programmiererfahrung haben, sollten Sie ein oder zwei Tutorials machen, die Sie ziemlich schnell an die SQL-Front bringen. Ich sehe nichts übermäßig kompliziert in Ihrem Code, so dass die häufigsten & amp; grundlegende Abfragen wie CREATE TABLE, SELECT ... WO werden wahrscheinlich alle Ihre Bedürfnisse erfüllen.

Bearbeiten

Ein weiterer Vorteil bei der Verwendung eines DBMS, den ich nicht erwähnt habe, ist, dass Sie views haben können, die andere Datenorganisation schemas leicht zugänglich machen, wenn man so sagen darf. Wenn Sie Ansichten erstellen, können Sie zur "Visualisierung nach Monat" zurückkehren, ohne eine Tabelle neu schreiben oder Daten duplizieren zu müssen.

    
Dominic Comtois 12.04.2015 19:06
quelle

Tags und Links