2013-03-28 2 views
6

Heroku에서 django-celery로 실행하는 간단한 작업이 있습니다. 같은 뭔가 : 기원 CSV 파일입니다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() 

. 파일 크기가 커지면 (50.000 줄 초과) 작업은 모든 메모리를 사용하여 시스템에서 취소 될 때까지 R14 오류를 제공합니다 (512MB의 사용 가능한 메모리의 150 %). 메모리는 절대로 해제되지 않으므로 수동으로 작업을 다시 시작해야합니다.

Linux 컴퓨터 또는 개발 컴퓨터의 포먼 (foremen)과 함께 실행하면 문제없이 완료됩니다 (모두 170.000 줄). 그것은 Heroku에서만 메모리를 누설하는 것 같습니다. 그런데 DEBUG = False로 실행합니다.

Heroku에서 샐러리 작업을 구현하면 문제가 발생합니까? 우리가 놓칠 수있는 건 없니? 이것은 Heroku에 배치에 쇼 스토퍼가되었습니다.

도움을 주시면 감사하겠습니다.

+0

그냥 일반적인 디버깅 제안 : 제 생각 엔이 장고도 셀러리도 관련이 없다는 것입니다. 이것을 증명하기 위해 최소한의 Heroku 앱 (Django가없는 평범한 "main")을 만들어 실행합니다. 실패하면 우선 requirements.txt를보고 디버그 인쇄를 나중에 추가하십시오. 성공하면, 알아낼 때까지 나머지 것들을 점차적으로 추가하십시오. 행운을 빕니다! –

+1

대용량의 메모리를 로컬로 사용하지 않고 그냥 눈치 채지 않았습니까? – JoshB

답변

0

나는 귀하의 경우 512MB 이상의 메모리를 사용하는 것으로 보인 JoshB에 동의합니다.

  • 당신은 어떤 작업 process_line을하고 전체 파일을 처리하는 작업 대신에 그들의 큐를 생성합니다. 이 경우 Heroku의 기억에 과부하가 걸리지 않습니다.

  • 당신을위한 다른 가능한 해결책은 당신의 dynos에서 1GB RAM을 사용할 수있는 Heroku의 새로운 서비스가 될 수 있습니다. 링크 : DEBUG is set to True는 그것이 실행 된 모든 SQL 문의 사본을 저장하기 때문에 때2x dynos beta

0

장고 메모리 누수가.

호스팅과 동일한 사양의 가상 컴퓨터를 사용하여 로컬에서 테스트 할 수 있습니다. 또는 ulimit을 사용하여 프로세스 메모리를 제한하십시오. 이렇게하면 로컬에서 코드가 512MB의 RAM에서만 작동하는지 확인할 수 있습니다.