2014-12-23 65 views
1

我正在開發使用Python Flask framework將處理PDF文檔網站。我將PDF文件存儲在MongoDB中,當我需要爲訪問用戶提供服務時,該文件運行良好。我現在需要做一些文字和圖片萃取,我使用pdfminer library。當我使用pdf2txt.py,並提供從文件系統中的文件,這條線(context here)的作品幾乎瞬間:從文件讀取和MongoDB GridFS的區別?

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

但是當我編輯的代碼,使我公司提供的GridFS對象從我的MongoDB,第二行(打完retreiving完)需要大約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質量結果(它在瀏覽器中呈現相同),但顯然它不一樣。

有誰知道這兩者之間的區別是什麼導致這個呼叫這麼長的時間,更重要的是如何解決的呢?歡迎所有提示!

回答

0

要回答我的問題:原來,因爲字符串在Python,這意味着任何字符串操作實習創造了新的字符串,可以得到手的,如果你有幾兆字節的字符串(即反覆複製「剩女」一個字符串處理成一個新的字符串會表現出減速)。

顯然,這凸顯了事實pdfminer庫寫的不好。所以我有兩種選擇:

  1. 編輯pdfminer庫併發送拉請求。
  2. 文件寫入到文件系統或StringIO的字符串緩衝區,並從讀出。

儘管選項1是最好的選擇,但我不知道如何知道這個庫或時間來學習這一點。所以我選擇了使用字符串緩衝區的選項2:

這現在需要大約1秒,雖然現在仍然很慢,但仍然可行。如果我們在開發過程中進一步研究,我們將看看我們是否可以分叉並改進pdfminer庫。