2013-08-21 5 views
1

Django 양식을 통해 업로드 된 Celery를 사용하여 큰 CSV 파일을 처리하겠다는 것이 저의 목표입니다. , 나는 다음과 취득을 파일의 크기가 위의 설정보다 큰 그러나django 셀러리 작업으로 대용량 파일 처리

@task 
def taskFunction(cleaned_data): 
    for line in csv.reader(cleaned_data['upload_file']): 
     MyModel.objects.create(field=line[0]) 

: 파일의 크기가 SETTINGS.FILE_UPLOAD_MAX_MEMORY_SIZE보다 작을 때, 나는 셀러리 작업에 폼의 cleaned_data 변수를 전달하고 사용하여 파일을 읽을 수 있습니다 오류 : 업로드 된 파일이 다시 일 때 나타납니다

return dumper(obj, protocol=pickle_protocol) 

: 스택 추적이 피클 중에 발생하는 오류를 보여줍니다

expected string or Unicode object, NoneType found 

임시 파일의 광고, 피클이 실패합니다.

이 문제에 대한 간단한 해결책은 FILE_UPLOAD_MAX_MEMORY_SIZE을 늘리는 것입니다. 그러나이 문제를 관리하는 더 좋은 방법이 있다면 궁금합니다.

+0

사용자 지정 [저장소] (https://docs.djangoproject.com/en/dev/howto/custom-file-storage/) 처리기가 더 깨끗합니다. –

답변

0

임시 파일에 저장하고 대신 파일 이름을 셀러리에 전달하십시오. 처리 후 삭제하십시오.

+0

셀러리 작업자가 임시 파일을 처리하기 전에 임시 파일을 삭제할 수 있습니까? – drlexa

+0

당신이 묻고있는 것이 확실하지 않습니다 ... 파일을 읽기 전에 파일을 삭제할 수 없습니다. 자동으로 삭제되고 다른 사용자가 읽을 수 없으므로 표준 라이브러리에서 tempfile.mkstemp를 사용하지 마십시오. 일반 파일을 작성하고 처리가 끝나면 손으로 삭제하십시오. 또는 django.db.models.FileField를 편리하게 사용한다면 – joshua