Wie kann eine Spalte in einer großen PostgreSQL-Tabelle mit Python / psycopg2 effizient aktualisiert werden?

Ich habe einen großen Tisch mit ca. 10 Millionen Zeilen in der PostgreSQL 9.4-Datenbank. Es sieht ungefähr so aus:

gid | number1 | random | result | ...
 1  |    2    |  NULL  |  NULL  | ...
 2  |   15    |  NULL  |  NULL  | ...
... |   ...   |   ...  |  ...   | ...

Nun möchte ich die Spalten aktualisierenrandom undresult als Funktion vonnumber1. Das bedeutet, dass mindestensrandom muss in einem Skript außerhalb der Datenbank erstellt werden. Da ich nur über begrenzten Arbeitsspeicher verfüge, frage ich mich, wie ich das mit @ effizient erledigen kanpsycopg2. Ich glaube, ich stehe vor zwei Problemen: Wie kann ich die Daten abrufen, ohne zu viel RAM zu verbrauchen, und wie kann ich sie wieder dort abrufen? Der simpleton Ansatz würde so aussehen:

curs.execute("""SELECT gid1, number1 FROM my_table;""")
data = curs.fetchall()

result = []
for i in data:
    result.append((create_random(i[1]), i[0]))
curs.executemany("""UPDATE my_table
                    SET random = %s
                    WHERE gid = %s;""",
                 results)
curs.execute("""UPDATE my_table
                SET result = number1 * random;""")

Allerdings wird dies sicherlich schnell mein ganzes Gedächtnis erschöpfen und ewig dauern, bisUPDATE my_table.

Was wäre eine intelligentere Strategie? Auf die Datenbank wird exklusiv zugegriffen und sie kann gesperrt werden. Die PostgreSQL-Zufallsfunktion ist für meinen Fall leider nicht geeignet.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage