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

psycopg2 rò rỉ bộ nhớ sau khi truy vấn lớn

Tôi gặp phải một vấn đề tương tự và sau vài giờ đổ máu, mồ hôi và nước mắt, tôi đã tìm thấy câu trả lời chỉ yêu cầu thêm một tham số.

Thay vì

cursor = conn.cursor()

viết

cursor = conn.cursor(name="my_cursor_name")

hoặc đơn giản hơn

cursor = conn.cursor("my_cursor_name")

Chi tiết được tìm thấy tại http://initd.org/psycopg/docs/usage.html#server-side-cursors

Tôi thấy các hướng dẫn hơi khó hiểu ở chỗ tôi cần phải viết lại SQL của mình để bao gồm "DECLARE my_cursor_name ...." và sau đó là "FETCH count 2000 FROM my_cursor_name" nhưng hóa ra psycopg thực hiện tất cả điều đó cho bạn dưới mui xe nếu bạn chỉ ghi đè tham số mặc định "name =None" khi tạo con trỏ.

Đề xuất sử dụng fetchone hoặc fetchmany ở trên không giải quyết được sự cố vì nếu bạn không đặt tham số name, psycopg theo mặc định sẽ cố gắng tải toàn bộ truy vấn vào ram. Điều duy nhất bạn có thể cần làm (ngoài việc khai báo một tham số tên) là thay đổi thuộc tính cursor.itersize từ mặc định 2000 thành 1000 nếu bạn vẫn còn quá ít bộ nhớ.



  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 tự động hóa PostgreSQL 12 sao chép và chuyển đổi dự phòng với repmgr - Phần 2

  2. Thu thập các khóa JSON đệ quy trong Postgres

  3. Làm cách nào để xuất lược đồ của cơ sở dữ liệu trong PostgreSQL?

  4. Truy vấn PostgreSQL để trả về kết quả dưới dạng danh sách được phân tách bằng dấu phẩy

  5. Làm thế nào để gỡ lỗi các thủ tục được lưu trữ postgresql?