PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tại sao việc lặp lại một QuerySet Django lớn lại tiêu tốn một lượng lớn bộ nhớ?

Nate C đã đóng, nhưng không hoàn toàn.

Từ tài liệu:

Bạn có thể đánh giá QuerySet theo những cách sau:

  • Lặp đi lặp lại. Một QuerySet có thể lặp lại và nó thực thi truy vấn cơ sở dữ liệu của nó vào lần đầu tiên bạn lặp lại nó. Ví dụ:điều này sẽ in dòng tiêu đề của tất cả các mục nhập trong cơ sở dữ liệu:

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

Vì vậy, mười triệu hàng của bạn được truy xuất, tất cả cùng một lúc, khi bạn lần đầu tiên vào vòng lặp đó và nhận dạng lặp lại của bộ truy vấn. Sự chờ đợi mà bạn trải nghiệm là Django tải các hàng cơ sở dữ liệu và tạo các đối tượng cho từng hàng, trước khi trả về thứ gì đó mà bạn thực sự có thể lặp lại. Sau đó, bạn có mọi thứ trong bộ nhớ và kết quả tràn ra.

Từ việc đọc tài liệu của tôi, iterator() không làm gì hơn ngoài việc bỏ qua các cơ chế bộ nhớ đệm bên trong của QuerySet. Tôi nghĩ rằng nó có thể hợp lý khi thực hiện từng việc một, nhưng ngược lại, điều đó sẽ yêu cầu mười triệu lượt truy cập riêng lẻ trên cơ sở dữ liệu của bạn. Có lẽ không phải tất cả những gì mong muốn.

Lặp lại các tập dữ liệu lớn một cách hiệu quả là điều mà chúng tôi vẫn chưa hiểu đúng, nhưng có một số đoạn mã ngoài đó bạn có thể thấy hữu ích cho mục đích của mình:

  • Trình lặp Django QuerySet hiệu quả về bộ nhớ
  • bộ truy vấn hàng loạt
  • 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. Cách Log () hoạt động trong PostgreSQL

  2. Postgres:chọn tổng các giá trị rồi tính tổng lại

  3. Psql không thể kết nối với máy chủ:Không có tệp hoặc thư mục như vậy, lỗi 5432?

  4. Postgresql Chọn các hàng có cột =mảng

  5. Chuyển đổi một ngày Julian thành một ngày trong PostgreSQL