Aggregation speichern () s in Django?

Ich bin mit Django mit einem sqlite Backend, und schreiben Leistung ist ein Problem. Ich kann zu einem "richtigen" db irgendwann absolvieren, aber für den Moment bin ich mit sqlite stecken. Ich denke, dass meine Schreib-Performance-Probleme vermutlich mit der Tatsache zusammenhängen, dass ich eine große Anzahl von Zeilen schaffe, und vermutlich jedes Mal, wenn ich save() eins, das es sperrt, entriegelt und die DB auf der Festplatte synchronisiert.

Wie kann ich eine große Anzahl von save() Aufrufen in einer einzigen Datenbankoperation zusammenfassen?

3 Solutions collect form web for “Aggregation speichern () s in Django?”

Eigentlich ist das einfacher zu tun, dann denkst du. Sie können Transaktionen in Django verwenden. Diese Batch-Datenbank-Operationen (speziell speichern, einfügen und löschen) in einem Vorgang. Ich habe die einfachste zu verwenden, ist commit_on_success . Im Wesentlichen wickeln Sie Ihre Datenbank speichern Operationen in eine Funktion und verwenden Sie dann die commit_on_success Dekorateur.

 from django.db.transaction import commit_on_success @commit_on_success def lot_of_saves(queryset): for item in queryset: modify_item(item) item.save() 

Dies wird eine enorme Geschwindigkeit erhöhen. Sie erhalten auch den Vorteil von Roll-backs, wenn eines der Items fehlschlägt. Wenn du Millionen von commit_manually Operationen hast, dann musst du sie in Blöcken mit dem commit_manually und transaction.commit() commit_manually transaction.commit() aber das habe ich selten benötigt.

Ich hoffe, das hilft,

Wille

Neu ab Django 1.6 ist atomar, eine einfache API zur Steuerung von DB-Transaktionen . Kopiert verbatim aus den docs:

Atomar ist sowohl als dekorateur verwendbar:

 from django.db import transaction @transaction.atomic def viewfunc(request): # This code executes inside a transaction. do_stuff() 

Und als Kontextmanager :

 from django.db import transaction def viewfunc(request): # This code executes in autocommit mode (Django's default). do_stuff() with transaction.atomic(): # This code executes inside a transaction. do_more_stuff() 

Legacy django.db.transaction Funktionen django.db.transaction autocommit() , commit_on_success() und commit_manually() wurden veraltet und werden in Django 1.8 entfernt.

"Wie kann ich eine große Anzahl von save () Anrufen in einer einzigen Datenbankoperation zusammenfassen?"

Das brauchst du nicht Django verwaltet bereits einen Cache für dich. Sie können nicht verbessern, dass es DB-Caching ist, indem Sie versuchen, sich herumzuspielen.

"Schreiben Performance-Probleme sind wahrscheinlich mit der Tatsache, dass ich die Schaffung einer großen Anzahl von Zeilen"

Richtig.

SQLite ist ziemlich langsam. Das ist der Stand der Dinge. Abfragen sind schneller als die meisten anderen DBs. Schriften sind ziemlich langsam.

Betrachten Sie mehr ernsthafte Architektur ändern. Laden Sie Zeilen während einer Web-Transaktion (dh Bulk-Upload-Dateien und Laden der DB aus diesen Dateien)?

Wenn Sie Bulk-Laden innerhalb einer Web-Transaktion tun, stoppen Sie. Du musst etwas schlauer machen. Verwenden Sie Sellerie oder verwenden Sie eine andere "Batch" -Funktion, um Ihre Lasten im Hintergrund zu machen.

Wir versuchen, uns selbst auf Datei-Validierung in einer Web-Transaktion zu begrenzen und die Lasten, wenn der Benutzer nicht auf ihre Seite von HTML warten.

  • Verbinden Sie mit Pythons sqlite Modul ist langsamer als es manuell zu tun
  • NumPy Arrays mit SQLite
  • Python - mysqlDB, sqlite Ergebnis als Wörterbuch
  • Verwenden von SQLAlchemy-Sitzung aus Flasche erhöht "SQLite-Objekte, die in einem Thread erstellt wurden, können nur in demselben Thread verwendet werden"
  • Python und SQLite: Überprüfen Sie, ob ein Element in einer Datenbank vorhanden ist?
  • SQLite über ein Netzwerk
  • Wie kann ich eine In-Memory-SQLite-Datenbank in Python anhängen?
  • Gibt es einen Weg, um eine Liste der Spaltennamen in sqlite zu bekommen?
  • Lesen aus der Datenbank mit SQLite und Python: Falsche Anzahl der gelieferten Bindung
  • Warum ist SQLAlchemy mit sqlite 25 mal langsamer einsetzbar als mit sqlite3 direkt?
  • Mit SQLite's FTS3 / 4 mit Python 3
  • Python ist die beste Programmiersprache der Welt.