2013-03-28 27 views
6

Mamy proste zadanie uruchomione z django-selerem na Heroku. Coś jak:Zadanie Heroku selera w tle

@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() 

Gdzie pochodzenie jest plik CSV. Gdy plik jest duży (ponad 50 000 linii), zadanie zajmuje całą pamięć, powodując błędy R14 do czasu anulowania przez system (przy 150% dostępnej pamięci 512 MB). Pamięć nigdy nie jest zwolniona i musimy ręcznie zrestartować zadanie.

Działa na komputerze z systemem Linux lub z brygadzistą na maszynie programistycznej, działa bez żadnych problemów (wszystkie 170 000 linii). Wydaje się, że jest to wyciek pamięci TYLKO na Heroku. Nawiasem mówiąc, uruchamiamy z DEBUG = False.

Czy coś jest zepsute przy realizacji zadań selerowych Heroku? Cokolwiek możemy przegapić? Stało się to show-stoperem przy wdrażaniu na Heroku.

Każda pomoc będzie bardzo ceniona.

+0

Po prostu ogólna sugestia debugowania: domyślam się, że nie ma to związku ani z Django, ani z Selerami. Aby to udowodnić, stworzyłem minimalną aplikację Heroku (bez Django, zwykły "główny"), który to robi i próbuje uruchomić. Jeśli się nie uda, najpierw sprawdź swój plik requirements.txt i dodaj odbitki debugowania później. Jeśli mu się to uda, zacznij stopniowo dodawać resztę, dopóki się nie zorientujesz. Powodzenia! –

+1

Czy jesteś pewien, że nie używasz dużej ilości pamięci lokalnie i po prostu nie zauważyłeś? – JoshB

Odpowiedz

0

Zgadzam się z JoshB, że w twoim przypadku zajmuje to więcej niż 512 MB pamięci.

  • Co zrobić, jeśli zadanie process_line i utworzyć kolejkę z nich zamiast zadanie obsłużyć cały plik. W takim przypadku twoja pamięć na Heroku nie zostanie przeciążona.

  • Innym możliwym rozwiązaniem dla Ciebie może być nowa usługa Heroku, w której możesz używać 1 GB pamięci RAM na swoich dynach. Link:2x dynos beta

0

Django wyciek pamięci podczas DEBUG is set to True ponieważ zapisuje kopię każdego SQL ona zrealizowana.

Możesz testować lokalnie używając maszyny wirtualnej o takich samych specyfikacjach, jakie posiada Twój hosting. Lub użyj ulimit, aby ograniczyć pamięć procesową. W ten sposób możesz sprawdzić, czy lokalnie twój kod działa tylko z 512 MB pamięci RAM.

Powiązane problemy