PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengapa iterasi melalui Django QuerySet besar menghabiskan banyak memori?

Nate C sudah dekat, tapi tidak cukup.

Dari dokumen:

Anda dapat mengevaluasi QuerySet dengan cara berikut:

  • Pengulangan. QuerySet dapat diubah, dan menjalankan kueri basis datanya saat pertama kali Anda mengulanginya. Misalnya, ini akan mencetak judul semua entri dalam database:

    for e in Entry.objects.all():
        print e.headline
    

Jadi sepuluh juta baris Anda diambil, sekaligus, saat Anda pertama kali memasuki loop itu dan mendapatkan bentuk iterasi dari queryset. Penantian yang Anda alami adalah Django memuat baris basis data dan membuat objek untuk masing-masingnya, sebelum mengembalikan sesuatu yang sebenarnya dapat Anda ulangi. Kemudian Anda memiliki segalanya dalam memori, dan hasilnya akan keluar.

Dari pembacaan dokumen saya, iterator() tidak lebih dari mem-bypass mekanisme caching internal QuerySet. Saya pikir mungkin masuk akal untuk melakukan satu-per-satu, tetapi itu akan membutuhkan sepuluh juta klik individu di database Anda. Mungkin tidak semuanya diinginkan.

Mengulangi kumpulan data besar secara efisien adalah sesuatu yang masih belum kami lakukan dengan benar, tetapi ada beberapa cuplikan di luar sana yang mungkin berguna untuk tujuan Anda:

  • Iterator Django QuerySet Hemat Memori
  • set kueri batch
  • QuerySet Foreach


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Indeks PostgreSQL di JSON

  2. Menemukan string serupa dengan PostgreSQL dengan cepat

  3. tidak dapat membuat kunci utama peningkatan otomatis dengan flask-sqlalchemy

  4. Peningkatan Pelaporan Kemajuan di PostgreSQL 12

  5. Bisakah tipe data Postgres NUMERIC menyimpan nilai yang ditandatangani?