Tôi đã so sánh một tập lệnh PHP cũ của tôi so với phiên bản Django mới hơn và mới hơn, với phiên bản PHP đầy đủ và tất cả đều hoạt động nhanh hơn. MUCH nhanh hơn đến mức mà một cái gì đó đã được sai trên một Django.Django (?) Thực sự chậm với các tập dữ liệu lớn sau khi thực hiện một số hồ sơ python
Đầu tiên, một số ngữ cảnh: Tôi có một trang báo cáo các báo cáo về dữ liệu bán hàng. Dữ liệu có thể được lọc theo một số thứ nhưng chủ yếu được lọc theo ngày tháng. Điều này làm cho nó một chút khó khăn để cache nó như là khả năng cho kết quả là gần như vô tận. Có rất nhiều con số và tính toán được thực hiện nhưng nó không bao giờ là một vấn đề để xử lý trong PHP.
CẬP NHẬT:
Sau một số thử nghiệm bổ sung không có gì trong quan điểm của tôi đó gây ra sự suy giảm là. Nếu tôi chỉ đơn giản là số-crunching dữ liệu và phun ra 5 hàng của HTML rendered, nó không phải là chậm (vẫn còn chậm hơn so với PHP), nhưng nếu tôi vẽ rất nhiều dữ liệu, nó rất chậm.
Bất cứ khi nào tôi chạy báo cáo lớn (ví dụ: tất cả doanh số bán hàng trong năm), mức sử dụng CPU của máy sẽ đạt 100%. Không biết nếu điều này có nghĩa là nhiều. Tôi đang sử dụng mod_python và Apache. Có lẽ việc chuyển sang WSGI có thể giúp ích gì?
Thẻ mẫu của tôi hiển thị tổng phụ/tổng số quá trình từ 0,1 giây đến 1 giây cho các tập rất lớn. Tôi gọi cho họ khoảng 6 lần trong báo cáo để họ có vẻ không phải là vấn đề lớn nhất.
Bây giờ, tôi chạy một profiler Python và đã trở lại với những kết quả này:
Ordered by: internal time List reduced from 3074 to 20 due to restriction ncalls tottime percall cumtime percall filename:lineno(function) 2939417 26.290 0.000 44.857 0.000 /usr/lib/python2.5/tokenize.py:212(generate_tokens) 2822655 17.049 0.000 17.049 0.000 {built-in method match} 1689928 15.418 0.000 23.297 0.000 /usr/lib/python2.5/decimal.py:515(__new__) 12289605 11.464 0.000 11.464 0.000 {isinstance} 882618 9.614 0.000 25.518 0.000 /usr/lib/python2.5/decimal.py:1447(_fix) 17393 8.742 0.001 60.798 0.003 /usr/lib/python2.5/tokenize.py:158(tokenize_loop) 11 7.886 0.717 7.886 0.717 {method 'accept' of '_socket.socket' objects} 365577 7.854 0.000 30.233 0.000 /usr/lib/python2.5/decimal.py:954(__add__) 2922024 7.199 0.000 7.199 0.000 /usr/lib/python2.5/inspect.py:571(tokeneater) 438750 5.868 0.000 31.033 0.000 /usr/lib/python2.5/decimal.py:1064(__mul__) 60799 5.666 0.000 9.377 0.000 /usr/lib/python2.5/site-packages/django/db/models/base.py:241(__init__) 17393 4.734 0.000 4.734 0.000 {method 'query' of '_mysql.connection' objects} 1124348 4.631 0.000 8.469 0.000 /usr/lib/python2.5/site-packages/django/utils/encoding.py:44(force_unicode) 219076 4.139 0.000 156.618 0.001 /usr/lib/python2.5/site-packages/django/template/__init__.py:700(_resolve_lookup) 1074478 3.690 0.000 11.096 0.000 /usr/lib/python2.5/decimal.py:5065(_convert_other) 2973281 3.424 0.000 3.424 0.000 /usr/lib/python2.5/decimal.py:718(__nonzero__) 759014 2.962 0.000 3.371 0.000 /usr/lib/python2.5/decimal.py:4675(__init__) 381756 2.806 0.000 128.447 0.000 /usr/lib/python2.5/site-packages/django/db/models/fields/related.py:231(__get__) 842130 2.764 0.000 3.557 0.000 /usr/lib/python2.5/decimal.py:3339(_dec_from_triple)
tokenize.py đi ra trên đầu trang, có thể làm cho một số cảm giác như tôi đang làm rất nhiều định dạng số . Decimal.py có ý nghĩa vì báo cáo về cơ bản là 90% số. Tôi không có đầu mối những gì được xây dựng trong phương pháp match
là như tôi không làm bất kỳ Regex hoặc tương tự trong mã của riêng tôi (Something Django đang làm gì?) Điều gần nhất là tôi đang sử dụng itertools ifilter.
Có vẻ như đó là những thủ phạm chính và nếu tôi có thể tìm ra cách để giảm thời gian xử lý của những người đó thì tôi sẽ có một trang nhanh hơn rất nhiều.
Có ai có bất kỳ đề xuất nào về cách tôi có thể bắt đầu giảm số này không? Tôi không thực sự biết làm thế nào tôi sẽ sửa lỗi này các vấn đề tokenize/thập phân mà không cần loại bỏ chúng.
Cập nhật: Tôi chạy một số thử nghiệm có/không có bộ lọc trên hầu hết dữ liệu và thời gian kết quả khá nhiều trở lại giống nhau, sau này nhanh hơn một chút nhưng không nhiều là nguyên nhân của vấn đề. Điều gì là chính xác xảy ra trong tokenize.py?
Không thể đề xuất điều gì đó hữu ích nếu không có mã xem và hướng dẫn lược tả của bạn. –
Alex: Quan điểm của tôi khá đơn giản. Nó kéo lên danh sách các mục nhập ban đầu, sau đó nếu báo cáo được sửa đổi, nó sẽ thêm một số bộ lọc. Đó thực sự là nó. Mẫu của tôi sau đó tập hợp lại các tập dữ liệu thành hai phần và sau đó lặp qua tất cả, gọi templatetags trên đường đi (Nhưng tôi đã hẹn giờ các thẻ mẫu để thực hiện trong 0,1 -> 0,5 giây .. các templatetags là tổng phụ/tổng của báo cáo do đó thời gian thực hiện là ok trên bộ dữ liệu khổng lồ.) – Bartek
@Bartek: Vui lòng không bình luận về câu hỏi của riêng bạn. Đó là câu hỏi của bạn, bạn có thể cập nhật nó để chứa tất cả các sự kiện có liên quan. –