Wie verwandeln Sie eine riesige CSV in SQLite mit Pandas?
Ich habe eine große Tabelle (über 60 GB) in form einer CSV-Datei archiviert. Ich möchte, um es zu transformieren in eine SQLite-Datei.
Was ich im moment tun im folgenden:
import pandas
import sqlite3
cnx = sqlite3.connect('db.sqlite')
df = pandas.read_csv('db.gz', compression='gzip')
df.to_sql('table_name', cnx)
Es funktioniert gut für kleinere Dateien, aber auch mit den großen Dateien habe ich Probleme mit dem Speicher. Das problem ist, dass pandas liest die gesamte Tabelle in den Speicher (RAM) und speichert Sie dann in die SQLite-Datei.
Gibt es eine elegante Lösung für dieses problem?
read_csv
dauertchunksize
param, dies gibt ein Stück, dass die Anzahl der Zeilen, so kann man iterativ LesenN
Zeilen und schreiben Siesql
siehe die Dokumentation: pandas.pydata.org/pandas-docs/stable/generated/...- Sie haben die Verwendung von python und pandas? Warum nicht
.import
in die SQLite - Befehlszeile?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das wird problematisch mit
pandas
aufgrund seiner Größe. Irgendeinem Grund Sie nicht verwenden können, diecsv
- Modul und nur eine Iteration durch die Datei.Grundlegende Idee (ungetestet):
Ich habe nicht getan, alle arbeiten mit CSVs in der Größe, aber es klingt wie die Art von Sache, die Odo vielleicht lösen sich schnell.
Habe ich eine kursorische Prüfung der Dokumente, und es scheint, Sie haben etwas geschrieben Thema größer-als-Speicher CSV-parsing in SQL-Datenbanken, die speziell ruft SQLite3 als Ziel.
Hier ist das Beispiel, das Sie veröffentlichen, für die Analyse einer 33 GB text-Datei.
[Update 06-15-2017]
Scheint es, dass csv2sqlite.py kann der Weg zu gehen mit SQLite. Auf jeden Fall, Chuck-von-Chuck ist zu langsam für große Datei (> 1GB). Sobald ich das getestet habe einen 6,5 GB nyc311calls.csv mit csv2sqlite.py es dauerte nur ~ 24 Minuten, um eine SQLite-Datenbank-Datei mit den Daten-Typ zu raten. 24 Minuten ist ähnlich wie das verbringen der Zeit bei MySQL "LOAD DATA INFILE". Das ist nicht schlecht, obwohl Sie möglicherweise ändern Sie den Datentyp für einige Spalten. Meiner Meinung nach, zu verwenden csv2sqlite.py ist die Zeit-effiziente Methode zum erstellen einer SQLite-Datenbank-Datei aus csv-Datei jetzt.
1) Herunterladen csv2sqlite.py von hier und steckte es in das directory mit einer csv-Datei.
2) Durch die Verwendung
Windows Prompt
, gehen Sie zu dem Verzeichnis, das die csv2sqlite.py und die csv-Datei (ex. nyc311calls.csv) importieren möchten.3) Führen Sie den code, der
python csv2sqlite.py nyc311calls.csv database_name.db
und warten. Hinweis: python-PFAD enthalten sein sollten in IhremWindows Environment Variables
.Dies ist eine kleine, alte quest, aber es scheint niemand gab klare Antworten.
Ich hoffe, meine Antwort hilft Ihnen. Mit Sqlite habe ich empfehlen Sie, um zu sehen,diese Website, die Ihnen die Idee und was Sie tun sollten, ein chunk-für-chunk laden. Getestet habe ich mehrere Ansätze, aber bis jetzt ist dies der zuverlässigste Weg, meiner Meinung nach.
Grundlegende Vorgehensweise ist so:
1) Importieren Sie ein kleiner Teil der großen Tabelle pandas.
2) - Prozess und laden Sie Sie auf SQLite.
3) Halten Sie an, um fortzufahren.
Ich hochgeladen mehr detaillierte Vorgehensweise von dem, was ich Tat hier (Jupyter-Datei), wenn Sie interessiert sind in. Finden Sie die NYC311call Daten hier
Ein paar Kommentare von mir.
1) Odo-Paket ist nicht vollständig funktionieren, wenn Sie Daten enthalten, die leere Zeichenfolgen. Ich hoffe, dass Sie verbessern könnte, diese Fragen. d.h. wenn Sie Daten ist sehr sauber und gut organisiert, Odo-Paket könnte die Möglichkeit sein.
2) Der obige Ansatz ist eine wirklich zeitraubende Arbeit. Vor allem, eine ~6GB Tabelle mehr als 24 Stunden dauern. Weil pandas langsam ist.
3) Wenn Sie sich nicht daran SQLite, ich würde sagen MySQL "LOAD DATA INFILE" ist eine gute option für Sie. Sie können herausfinden, wie zu tun, es aus dem internet suchen. Solange ich getestet, das ist viel zuverlässiger und effizienter Weise. Später können Sie konvertieren, um die sqlite-wenn Sie wirklich brauchen, um die Verwendung von sqlite. Vor allem, wenn die Daten viele leere strings und datetime-Spalten, die benötigt werden, um zu konvertieren, um datetime-Typ, ich auf jeden Fall gehen Sie mit MySQL.