2016-09-08 2 views
2

Ich habe eine SQLite-Datenbank (ca. 11 GB), die mehrere Tabellen einschließlich der Tabellen distance und vertices hat. Der Tisch distance ist ziemlich groß (120 Millionen Reihen), vertices ist kleiner (15 000 Reihen). Ich möchte sqlite3 in Python verwenden, um eine Spalte von distance um Werte einer anderen Spalte in vertices zu aktualisieren. Die Tabellenscheitelpunkte haben einen Index für die Spalte cat und einen weiteren Index für orig_cat.Update große SQLite-Datenbank in Stücke

Was ich tue:

import sqlite3 
db_path='path/to/db.db' 

conn = sqlite3.connect(db_path) 
cur = conn.cursor() 

cur.execute('''UPDATE distance SET 
       from_orig_v = (SELECT orig_cat FROM vertices WHERE cat=distance.source)''') 

jedoch, dass die Update-Anweisung auf eine so große Datenbank ausgeführt wird, führt zu einem Speicherfehler. Die Speicherbelegung steigt stetig bis zum Absturz. Ich bin auf der Suche nach Ratschlägen, eine so große Update-Anweisung auszuführen, ohne den Arbeitsspeicher zu verlieren? Vielleicht Verarbeitung der Aktualisierung in Chunks (d. H. Zeilen von distance Tabelle) und nach z. 1000 Updates für freien Speicher? Wie wäre das mit Python/SQLite?

Antwort

2

Es sollte möglich sein, Stücke wie dies mit Aussagen zu aktualisieren:

UPDATE distance SET ... WHERE rowid BETWEEN 100000 AND 200000; 

Sie brauchen nicht mehrere Transaktionen zu verwenden; Das einzige, was tatsächlich im Speicher gehalten werden muss, ist die Liste der Zeilen, die in einer einzigen Anweisung aktualisiert werden sollen. (In der Theorie, wenn der Speicher ausgeht, sollten Sie eine entsprechende Fehlermeldung erhalten. In der Praxis einige Betriebssysteme overcommit memory und sagen Sie der Anwendung nicht, bis es zu spät ist.)

+0

Ich denke über die Verwendung dieser als eine Lösung für ein ähnliches Problem. Haben Sie irgendwelche Ideen, warum SQLite3 beim Update einer großen Datenbank abstürzt? –

Verwandte Themen