2014-12-23 7 views
1

PDF를 처리 할 파이썬 Flask framework으로 웹 사이트를 개발 중입니다. PDF 파일을 MongoDB에 저장합니다. 방문하는 사용자에게 제공해야 할 때 잘 작동합니다. 나는 이제 pdfminer library을 사용하는 텍스트 및 이미지 추출 작업을 수행해야합니다.파일 읽기와 MongoDB GridFS의 차이점은 무엇입니까?

for page in PDFPage.get_pages(file('ticket.pdf', 'rb'), pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True): pass 

하지만 난 코드를 편집 할 때 내 MongoDB를, 두 번째 줄에서 GridFS 객체를 제공 할 수 있도록 : 나는 pdf2txt.py을 사용하여 파일 시스템에서 파일을 제공 할 때,이 라인 (context here는) 거의 즉시 작동 성공하기 위해 약 8 초 소요합니다 (불러 오는 완성 된이 후 지금) (결과는 위의 코드와 동일) :

document = UserDocument.objects.first() 
for page in PDFPage.get_pages(document.file_, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True): pass 

제가 을 가정하기 때문에 놀라움 이런 종류의 나의 MongoDB를에서 파일을 복용하거나 복용 그것은 파일 시스템에서 e를 리턴합니다. qual 결과 (브라우저에서 동일한 결과를 렌더링 함). 그러나 분명히 동일하지는 않습니다.

두 사람의 차이점이 무엇 때문에이 전화가 오랜 시간이 걸릴지, 더 중요한 것은 어떻게 해결할 수 있는지 아는 사람이 있습니까? 모든 팁을 환영합니다!

답변

0

내 질문에 답하기 : 문자열이 파이썬으로 인턴되기 때문에 어떤 문자열 조작이 멀티 메가 바이트 문자열이있는 경우 손을 뗄 수있는 새로운 문자열을 만듭니다 (즉, "나머지" 새 문자열로 처리 할 문자열을 이렇게 느리게 표시합니다.

분명히 이것은 pdfminer 라이브러리가 잘못 작성되었다는 사실을 강조합니다. 따라서 두 가지 옵션이 있습니다.

  1. pdfminer lib를 편집하고 끌어 오기 요청을 보냅니다.
  2. 파일 시스템 또는 StringIO 문자열 버퍼에 파일을 쓰고 그 파일을 읽습니다.

옵션 1이 최선의 선택이지만,이 라이브러리 또는 시간을 알 수는 없습니다. 그래서 문자열 버퍼를 사용하여 옵션 2를 선택했다 :

document = UserDocument.objects.first() 
fp = StringIO() 
fp.write(document.file_.read()) # Also takes about 0.8 sec, but thats still faster than 8 seconds. 
for page in PDFPage.get_pages(file('ticket.pdf', 'rb'), pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True): pass 

이 지금 여전히 느린 있지만, 지금은 가능한 약 1 초가 걸립니다. 개발 프로세스가 더 진행되면 pdfminer 라이브러리를 포크하고 향상시킬 수 있는지 확인하게 될 것입니다.