Vorschläge zur Verbesserung der Geschwindigkeit der Tabellentransformation im NormalisierungsprozessPython

Python-Programme
Guest
 Vorschläge zur Verbesserung der Geschwindigkeit der Tabellentransformation im Normalisierungsprozess

Post by Guest »

Ich habe einen Datensatz heruntergeladen, der als Milliardenreihe 300-Feld-CSV erhältlich ist und ihn in Postgresql portiere und mit Python/Psycopg manipuliert, in der Hoffnung, eine gewisse Normalisierung ausüben. Jede Zeile besteht aus einigen Feldern, die eine Wetterstation identifizieren (ich habe festgestellt, dass diese Werte zusammen gesperrt sind; der Wert von einem ist explizit mit dem Wert eines anderen verbunden). Dann gibt es ein Datumsfeld, und der Rest der Felder sind Beobachtungswerte und Flaggen für jeden dieser Werte. Ich habe zunächst eine einzelne Tabelle erstellt, die alle Zeilen und Spalten enthält und Indizes für 1) der Identifikatorin mit 11-Charakter-Station, 2) das Datum erstellt hat) und 3) den Bahnhofsbezeichner und die anderen gegenseitig gesperrten Station-charakteristischen Felder. < /p>
Aus dieser Tabelle habe ich ausgewählt, um eine neue Tabelle nur als "Stationen" bezeichnete Tabellen zu erstellen (es gibt ungefähr 128.000 davon) - die Senderkennung und ihre anderen Merkmale. Ich habe dieser Tabelle eine serielle Primärschlüsselspalte hinzugefügt. Spalten mit einer einzelnen Spalte "station_id" vom Typ Ganzzahl. Also frag ich die Tabelle "Stationen", um nur den Primärschlüssel und die Identifikerin mit 11-Charakter-Station in Paaren wie SO zurückzugeben: < /p>
dbcur.execute('SELECT (id,station) FROM stations;')
all_stations = dbcur.fetchall()
< /code>
[Hinweis: Ich weiß, dass es keine Klammern um die Variablen geben sollte; Die Folgen, dies zu tun Feld und der Rest der Beobachtungsfelder aus dieser Anfangstabelle (als "Quelle" bezeichnet). So wird ein Select aus Quelle, wobei Station = '' für jeden Wert von "station_id" durchgeführt wird, und die Werte, die sich aus der Auswahl von "select_set" ergeben Wert von "station_id". Hier ist der Code, der dies tut: < /p>
def prepend_each(prepend, to):
return ((prepend,) + i for i in to)

for station_id_pair in all_stations:
station_id = station_id_pair[0][0] # This is the station primary key
station_code = station_id_pair[0][1] # This is the 11-character station code
dbcur.execute("SELECT {} FROM source WHERE station='{}'".format(','.join(select_set), station_code))
result = dbcur.fetchall()
with dbcur.copy("COPY observations ({}) FROM STDIN".format(','.join(['station_id'] + select_set))) as copy:
for copychunk in prepend_each(station_id, result):
copy.write_row(copychunk)
dbconn.commit()
< /code>
Die ausgewählten Ergebnisse für jede Reise durch diese für die Schleife können erheblich variieren, aber im Durchschnitt dauert jede Reise etwa eine Sekunde, sodass ich erwarten kann, dass diese Transformation ungefähr anderthalb Tage dauern kann. Gibt es etwas über meinen Codierungsansatz, den ich ändern könnte, um die Dinge zu beschleunigen? RAID10 -Volumen, obwohl er nicht gesagt wurde, und ich habe keine Ahnung, wie es sich um Prioritäten dieser Operation im Vergleich zum tatsächlichen I/A stammt, sodass ich nicht weiß, ob die Initialisierung der RAID -Lautstärke nach postgresql im Wege steht, um zu lesen und zu schreiben, zu lesen und zu schreiben Oder nicht. Während ich mich damit zufrieden bin, diese Operation abgeschlossen zu lassen, wird es immer noch von Bedeutung sein, wenn es einen besseren Ansatz gibt, aber es wird immer noch eine Rolle spielen, da ich einen weiteren Durchlauf für die Flaggen von vier probservierenden Attributen durchführen muss. Wenn Sie sich HTOP auf dem PostgreSQL -Server ansehen, scheint es, als würde Python mehr von der CPUS -Zeit in Anspruch nehmen als Postgresql.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post