Schnellste Möglichkeit, Millionen von Dateien in R zu importieren?

8

Ich habe 15 Millionen CSV-Dateien mit jeweils zwei Spalten (Integer und Float) und zwischen 5 und 500 Zeilen. Jede Datei sieht ungefähr so ​​aus:

%Vor%

Zur Zeit überspiele ich alle Dateien und verwende read.csv() , um jede Datei in eine große Liste zu importieren. Hier ist eine vereinfachte Version:

%Vor%

Später in meinem Code gehe ich zurück durch jede Matrix in der Liste und berechne einige Metriken.

Nach dem Start dieses Imports scheint es etwa 3 bis 5 Tage in Anspruch zu nehmen. Gibt es einen schnelleren Weg, dies zu tun?

BEARBEITEN : Ich habe weitere Details zu meinem Code hinzugefügt.

    
stepthom 23.03.2012, 16:21
quelle

4 Antworten

6

Die Verwendung von scan (als Joshua-Status im Kommentar) könnte schneller sein (3-4 mal):

%Vor%

Der Hauptunterschied besteht darin, dass scan eine Liste mit zwei Elementen zurückgibt und read.csv returns data.frame .

    
Marek 23.03.2012, 17:00
quelle
7

Ich habe kein klares Ziel, aber wenn Sie versuchen, all diese Dateien in einer einzigen R-Datenstruktur zu lesen, dann sehe ich zwei Hauptprobleme:

  1. Dateizugriffszeiten - ab dem Zeitpunkt, an dem Sie read.csv anfordern, beginnen unzählige komplexe Prozesse auf Ihrer Maschine mit der Suche, ob diese Datei existiert, den Speicherort dieser Datei im Speicher oder auf der Festplatte (und die Daten im Speicher) wenn nötig, dann interpretiere ich die Daten in R. Ich würde erwarten, dass dies eine fast konstante Verlangsamung sein würde, wenn Sie Millionen von Dateien lesen.
  2. Wachsen Sie Ihre einzelne Datenstruktur mit jeder neuen gelesenen Datei. Jedes Mal, wenn Sie Ihrer Matrix ein paar Zeilen hinzufügen möchten, müssen Sie wahrscheinlich einen ähnlich großen Speicherblock neu zuordnen, um die größere Matrix zu speichern. Wenn Sie Ihr Array 15 Millionen Mal vergrößern, werden Sie hier sicherlich eine Leistungsverlangsamung bemerken. Mit diesem Problem wird die Leistung zunehmend schlechter, wenn Sie mehr Dateien einlesen.

Machen Sie also ein schnelles Profiling und sehen Sie, wie lange die Lesevorgänge dauern. Wenn sie langsamer werden, wenn Sie mehr Dateien einlesen, konzentrieren wir uns auf Problem Nr. 2. Wenn es ständig langsam ist, dann machen wir uns Sorgen um das Problem # 1.

In Bezug auf Lösungen würde ich sagen, dass Sie mit zwei Dingen beginnen könnten:

  1. Kombinieren Sie die CSV-Dateien in einer anderen Programmiersprache. Ein einfaches Shell-Skript würde wahrscheinlich den Job für Sie erledigen, wenn Sie nur Dateien durchforsten und sie zu einer einzigen großen Datei verketten. Wie Joshua und Richie unten erwähnen, können Sie dies vielleicht optimieren, ohne zu einer anderen Sprache wechseln zu müssen, indem Sie die effizienteren Funktionen scan() oder readlines() verwenden.
  2. Stellen Sie Ihre einheitliche Datenstruktur vor. Wenn Sie z. B. eine Matrix verwenden, legen Sie die Anzahl der Zeilen auf ~ 15 Millionen x 100 fest. Dadurch wird sichergestellt, dass Sie nur einmal Platz für dieses Objekt im Speicher finden müssen, und der Rest der Operationen fügt nur Daten ein in die vordimensionierte Matrix.

Fügen Sie weitere Details zu Ihrem Code hinzu (wie sieht die Liste aus, die Sie verwenden?) und wir können möglicherweise hilfreicher sein.

    
Jeff Allen 23.03.2012 16:39
quelle
2

Wie wäre es mit diesem allgemeinen Arbeitsablauf? Nicht getestet, obwohl.

%Vor%     
Roman Luštrik 23.03.2012 17:02
quelle
0

Wie Jeff erwähnt hat, gibt es hier einige Dinge, die sehr lange dauern können. Das Problem könnte der Dateizugriff oder das Einlesen von Dateien sein oder der Speicher reicht nicht aus, wenn Sie 15 Millionen Datenrahmen im RAM haben. Um das Problem zu verschlimmern, könnte der Botbeneck abhängig von der Spezifikation Ihres Rechners variieren (z. B. verlangsamt eine langsame Festplatte das Lesen der Dateien, ein Mangel an RAM ist ein Problem mit einer hohen Dateianzahl). Um das Problem zu lösen, müssen Sie ein Profiling durchführen.

Try liest gerade mal 10000 oder so Dateien ein und ruft system.time oder, besser gesagt, mit rbenchmark auf, um zu sehen, was die meiste Zeit kostet.

Dann schau dir den Link von joran an

Schnelles Lesen sehr großer Tabellen als Datenrahmen in R

und sehen, ob etwas von der Technik dort hilft.

    
Richie Cotton 23.03.2012 17:00
quelle

Tags und Links