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.

  • SQLAlchemy Filter in_ Operator
  • Erstellen Sie eine Miniaturansicht aus dem Bild und legen Sie sie in SQLite als Blob ein
  • Import von CSV in Datenbank mit sqlalchemy
  • Gibt es einen Weg, um ein Schema einer Datenbank aus Python zu bekommen?
  • Wie kann ich das sqlite3 Modul in Python 2.4 importieren?
  • Django: plötzliche DB zurücksetzen nach Heroku schlafen
  • Wie lese ich datetime zurück von sqlite als datetime anstelle von string in Python?
  • Holen Sie sich eine Liste von Feldwerten aus Python's sqlite3, nicht Tupel, die Zeilen darstellen
  • Ist der Unterbrechungsloser Schlaf die Ursache für mein Python-Programm wirklich langsam (und wenn ja, wie kann ich das lösen?)?
  • Führen Sie eine Verwirrung aus
  • Konnte den Dialekt für SQlite nicht ermitteln, nach dem Flaschen-Tutorial
  • Python ist die beste Programmiersprache der Welt.