2017-05-09 4 views
4

Es scheint, dass das Laden von Daten aus einer CSV schneller als von SQL (Postgre SQL) mit Pandas ist. (Ich habe eine SSD)Pandas laden CSV schneller als SQL

Hier ist mein Testcode:

import pandas as pd 
import numpy as np 

start = time.time() 
df = pd.read_csv('foo.csv') 
df *= 3 
duration = time.time() - start 
print('{0}s'.format(duration)) 

engine = create_engine('postgresql://user:[email protected]:port/schema') 
start = time.time() 
df = pd.read_sql_query("select * from mytable", engine) 
df *= 3 
duration = time.time() - start 
print('{0}s'.format(duration)) 

Die foo.csv und die Datenbank ist die gleiche (gleiche Menge an Daten und Spalten in beide, 4 Spalten, 100 000 Zeilen voll von zufälliger int).

CSV nimmt 0,05s

SQL 0,5s nimmt

Glaubst du, es ist normal, dass CSV 10 Mal schneller als SQL ist? Ich frage mich, wenn ich hier etwas fehlt bin ...

+0

ja. normal.... –

+0

Ok danke, ich war wirklich, obwohl SQL schneller war – Haelle

Antwort

3

Dies ist ein normales Verhalten, eine CSV-Datei zu lesen ist immer eine der schnellste Weg, um einfach Daten zu laden

Eine CSV sehr naiv und einfach . das Laden direkt von ihm wird sehr schnell sein. Für eine massive Datenbank mit komplexer Struktur ist CSV keine Option. SQL ist super schnell, um Daten aus der Tabelle auszuwählen und diese Daten an Sie zurückzugeben. Wenn Sie Daten auswählen, ändern und bearbeiten können, führt dies natürlich zu zusätzlichen Kosten.

Stellen Sie sich vor, Sie haben eine Zeitreihe in einem CSV von 1920 bis 2017 in einem CSV, aber Sie wollen nur Daten von 2010 bis heute.

csv Ansatz wäre die gesamte csv laden dann die Jahre wählen 2010 bis 2017.

SQL Ansatz die Jahre über SQL-Select-Funktion wäre

vorzuwählen In diesem Szenario wäre SQL viel schneller.

+1

Könnten Sie bitte ein wenig darauf eingehen? Warum laden Sie eine CSV schneller als die Daten aus einer relationalen Datenbank? – Vame

+0

@Vame eine CSV ist sehr naiv und einfach. Laden direkt von ihm ist super schnell. Sie können wirklich nur bestimmte Zeilen eines CSV auswählen, wenn Sie es laden. Für eine massive Datenbank mit komplexen Strukturen ist CSV keine Option. SQL ist super schnell, um Daten aus der Tabelle auszuwählen und diese Daten an Sie zurückzugeben. Wenn Sie Daten auswählen, ändern und bearbeiten können, führt dies natürlich zu zusätzlichen Kosten. Beispiel in Antwort –

+0

@StevenG Haelle verwendet Pandas, die mit dieser Art von Abfrage sehr viel erreichen können. Der Aufruf wäre df [(df.year> = 2010) & (df.year <= 2017)] Ich würde gerne einen Zeitvergleich zwischen diesen beiden sehen. Berücksichtigen Sie Folgendes: "Wird es in RAM geladen, um zu starten". – Back2Basics

0

Es ist vollkommen normal, dass CSV ist viel schneller als SQL, aber sie sind nicht für die gleiche Sache gemeint, auch wenn man sich für die gleiche Sache verwenden kann:

  1. CSV ist für die sequenziellen Zugriff Das heißt, Sie beginnen am Anfang der Datei und lesen jede Zeile nacheinander und behandeln sie nach Bedarf.

  2. SQL ist für indizierten Zugriff, dh Sie schauen sich einen Index an und dann gehen Sie in die Zeile, nach der Sie suchen. Sie können auch einen vollständigen Tabellenscan durchführen, dh keinen Index verwenden, der die Tabelle im Wesentlichen zu einem aufgeblähten CSV macht.

Ihre Anfrage ist ein Full-Table-Scan, es sieht nicht auf den Index, weil es für alle Daten geht, also ja, es ist normal.

Auf der anderen Seite, wenn Sie eine Abfrage wie

select * from mytable where myindex = "myvalue"; 

würden versuchen Sie einen enormen Schub bekommen im Vergleich zu den gleichen Zeilen in der csv zu suchen. Das liegt an den Indizes in SQL