2013-03-28 34 views
6

Chúng tôi có một nhiệm vụ đơn giản chạy với django-cần tây trên Heroku. Một cái gì đó như:Nhiệm vụ nền cần tây Heroku

@task 
Simple_task(): 
    for line in csv.reader(origin): 
     process_line(line) 

process_line(line): 
    fields = parse_line(line) 
    reg = Model1() # Django model 
    reg.field1 = fields[0] 
    reg.field2 = fields[1] 
    reg.field3 = fields[2] 
    reg.save() 

Nơi nguồn gốc là tệp csv. Khi tệp lớn (hơn 50.000 dòng), tác vụ chiếm toàn bộ bộ nhớ, cho lỗi R14 cho đến khi hệ thống bị hủy (với 150% bộ nhớ khả dụng là 512 MB). Bộ nhớ không bao giờ được phát hành và chúng tôi phải khởi động lại tác vụ theo cách thủ công.

Chạy trên máy Linux hoặc với máy phát trên máy phát triển, nó hoàn thành không có vấn đề gì (tất cả 170.000 dòng). Nó dường như bị rò rỉ bộ nhớ chỉ trên Heroku. Nhân tiện, chúng tôi chạy với DEBUG = False.

Có vấn đề gì xảy ra với việc thực hiện nhiệm vụ cần tây của Heroku không? Bất cứ điều gì chúng ta có thể bị mất tích? Điều này đã trở thành một show-stopper khi triển khai trên Heroku.

Mọi trợ giúp sẽ được đánh giá cao.

+0

Chỉ là một gợi ý gỡ lỗi chung: tôi đoán là điều này không liên quan đến cả Django lẫn Celery. Để chứng minh rằng, tôi sẽ tạo ra một ứng dụng Heroku tối thiểu (w/o Django, chỉ là một "chính" đồng bằng) mà thực hiện điều này, và cố gắng chạy nó. Nếu không thành công, hãy xem tệp requirements.txt của bạn trước và thêm bản in gỡ lỗi sau. Nếu thành công, hãy bắt đầu dần dần thêm phần còn lại của nội dung cho đến khi bạn tìm ra. Chúc may mắn! –

+1

Bạn có chắc chắn rằng nó không sử dụng một lượng lớn bộ nhớ cục bộ và bạn chỉ không nhận thấy? – JoshB

Trả lời

0

Tôi đồng ý với JoshB rằng dường như bạn cần nhiều hơn 512 MB bộ nhớ trong trường hợp của mình.

  • Nếu bạn thực hiện nhiệm vụ process_line và tạo hàng đợi thay vì nhiệm vụ để xử lý toàn bộ tệp. Trong trường hợp đó bộ nhớ của bạn trên Heroku sẽ không bị quá tải.

  • Giải pháp khả thi khác cho bạn có thể là dịch vụ mới từ Heroku, nơi bạn có thể sử dụng RAM 1 GB trên dynos của mình. Link:2x dynos beta

0

Django rò rỉ bộ nhớ khi DEBUG is set to True vì nó tiết kiệm một bản sao của tất cả các câu lệnh SQL nó đã được thực hiện.

Bạn có thể thử nghiệm cục bộ bằng máy ảo có cùng thông số kỹ thuật mà máy chủ lưu trữ của bạn có. Hoặc sử dụng ulimit để giới hạn bộ nhớ quá trình. Bằng cách này, bạn có thể kiểm tra xem mã của bạn có hoạt động với chỉ 512MB RAM không.

Các vấn đề liên quan