2016-04-24 13 views
1

Ich möchte etwa 700 Millionen Zeilen und 2 Spalten an eine Datenbank anhängen. Mit dem folgenden Code:Wie die Zeit zu reduzieren, die es dauert, an SQL-Datenbank in Python zu hängen

disk_engine = create_engine('sqlite:///screen-user.db') 
chunksize = 1000000 
j = 0 
index_start = 1 

for df in pd.read_csv('C:/Users/xxx/Desktop/jjj.tsv', chunksize=chunksize, header = None, names=['screen','user'],sep='\t', iterator=True, encoding='utf-8'): 
    df.to_sql('data', disk_engine, if_exists='append') 
    count = j*chunksize 
    print(count) 
    print(j) 

Es dauert eine sehr lange Zeit (ich schätze, es würde Tage dauern). Gibt es einen effizienteren Weg, dies zu tun? In R habe ich das data.table-Paket verwendet, um große Datensätze zu laden, und es dauert nur 1 Minute. Gibt es ein ähnliches Paket in Python? Als tangentialer Punkt möchte ich diese Datei auch physisch auf meinem Desktop speichern. Momentan gehe ich davon aus, dass Daten als temporäre Datei gespeichert werden. Wie würde ich das tun?

Auch vorausgesetzt, ich lade die Daten in eine Datenbank, möchte ich die Abfragen in einer Minute oder weniger ausführen. Hier einige Pseudo-Code von dem, was ich tun möchte, mit Python + SQL:

#load data(600 million rows * 2 columns) into database 
#def count(screen): 
    #return count of distinct list of users for a given set of screens 

Im Grunde bin ich die Anzahl der Bildschirme für einen bestimmten Satz von users.Is Rücksendung der Daten zu groß für diese Aufgabe? Ich möchte diese Tabelle auch mit einer anderen Tabelle zusammenführen. Gibt es einen Grund, warum die Freed-Funktion in R viel schneller ist?

+1

Gotcha, also verwenden Sie SQLite. Zu Ihrer Frage "gibt es ein Python-Äquivalent zu R-Datentabellen". Pandas ist diese Bibliothek. Der langsame Teil Ihres Codes ist das Schreiben der Datenbank. Können Sie die verschiedenen Benutzer nicht von der Variablen 'df' selbst zählen? Warum brauchst du SQL? –

+0

Ich nahm an, eine Datenbank wäre schneller Abfragen auszuführen. Wie würde ich als neuer Benutzer von python die Datensätze für df sehen? Wenn ich (df) drucke, erhalte ich den Objektnamen, und ich dachte, dass das Schreiben der Daten in SQL db in Bezug auf das Schreiben von Abfragen einfacher wäre und ich auch die Ausgabe meiner Tabelle sehen könnte. Außerdem bin ich nicht sicher, wie lange es dauern würde, um die Daten in meiner pd.read_csv-Anweisung zu laden. – zorny

+0

Es wäre wahrscheinlich viel einfacher, die Abfrage selbst in SQL zu schreiben, ja, aber wie Sie festgestellt haben, ist das Laden von Daten in eine Datenbank langsam.Persönlich würde ich empfehlen, dass Sie in [SparkSQL] (http://spark.apache.org/docs/latest/sql-programming-guide.html#overview) schauen und sich Sorgen machen, später in eine Datenbankdatei zu schreiben. –

Antwort

1

Wenn Sie Daten aus Ihrer TSV-Datei in SQLite importieren möchten, sollten Sie die native Importfunktion in SQLite selbst ausprobieren. Öffnen Sie einfach die sqlite Konsolenprogramm und etwas tun, wie folgt aus:

sqlite> .separator "\t" 
sqlite> .import C:/Users/xxx/Desktop/jjj.tsv screen-user 

nicht entsprechenden Indizes zu bauen Vergessen bevor irgendwelche Fragen zu tun.

+1

Das selbe würde für MySQL, BTW auch zutreffend sein. Lassen Sie die Datenbank den Import durchführen, indem Sie die gesamte Datei importieren. Ich habe dies mit mehreren GB-Dateien in vernünftigen Zeiten (Dutzende von Minuten) getan. – roadrunner66

0

Wie @John Zwinck bereits gesagt hat, sollten Sie wahrscheinlich native RDBMS-Tools zum Laden einer solchen Datenmenge verwenden.

Zunächst denke ich, dass SQLite kein richtiges Tool/DB für 700 Millionen Zeilen ist, besonders wenn Sie diese Daten später zusammenfügen/zusammenführen wollen.

Abhängig davon, welche Art der Verarbeitung möchten Sie mit Ihren Daten nach dem Laden zu tun, würde ich entweder free MySQL verwenden oder wenn Sie sich leisten können, einen Cluster mit - Apache Spark.SQL und Verarbeitung Ihrer Daten auf mehreren Clusterknoten parallelisieren.

Zum Laden Ihrer Daten in MySQL DB können und sollten Sie das native Tool LOAD DATA verwenden.

Hier ist eine great article zeigt, wie Datenladeprozess für MySQL optimieren (für verschiedene: MySQL-Versionen, Optionen MySQL, MySQL-Speicher-Engines: MyISAM und InnoDB usw.)

Fazit: Verwendung nativer DB-Tools zum Laden großer Mengen von CSV/TSV-Daten anstelle von Pandas, insbesondere wenn Ihre Daten nicht in den Speicher passen und wenn Sie Ihre Daten nach dem Laden verarbeiten (verbinden/zusammenführen/filtern/usw.).

+0

Nachdem Sie MySQL verwendet haben, um die Daten zu laden, ist es einfach, über Python/Pandas mit dieser Datenbank zu interagieren? Ist Spark auch nützlich, wenn Sie nur Ihren Laptop benutzen? – zorny

+0

@zorny, nein, die Idee ist, dass du Pandas nicht verwenden willst, außer wenn alle Daten, die du verarbeiten willst, in den Speicher passen oder du deine Daten leicht verarbeiten (verbinden, gruppieren, aggregieren, filtern, etc.) kannst Brocken mit Pandas, was selten der Fall ist. – MaxU

+0

@zorny, Die Verwendung von Spark auf einer Maschine/Laptop macht nicht viel Sinn, vielleicht nur zum Lernen ... Wenn Sie keine anderen Optionen haben und alle Ihre Daten auf Ihrem Laptop verarbeiten müssen, können Sie versuchen, es direkt zu tun in MySQL - es wurde für die Verarbeitung relationaler Daten entwickelt;) – MaxU

Verwandte Themen