从文件读取和MongoDB GridFS之间有区别吗?

克拉默65

我正在使用Python Flask框架开发一个可处理PDF的网站。我将PDF文件存储在MongoDB中,当我需要将它们提供给访问用户时,它可以很好地工作。现在,我需要使用pdfminer库进行一些文本和图像提取当我使用pdf2txt.py并从文件系统提供文件时,这一行(这里的context)可以立即工作:

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

但是,当我编辑代码以便从MongoDB提供GridFS对象时,第二行(因此在完成检索之后)需要大约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中获取文件或从文件系统中获取文件将返回相等的结果(在浏览器中呈现相同的结果),但显然并不相同。

有人知道两者之间的区别是什么导致这次通话花费很长时间,更重要的是我该如何解决?欢迎所有提示!

克拉默65

回答我自己的问题:事实证明,因为字符串是在Python中进行内插的,这意味着任何字符串操作都将创建新的字符串,如果您拥有多兆字节的字符串,则这些字符串会失控(例如,将字符串的“余数”重复复制到处理成一个新的字符串将表现出这样的减速)。

显然,这突出了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库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

`;`和`&&`和`|`之间有区别吗?

来自分类Dev

DictionarySectionHandler和NameValueSectionHandler之间有区别吗?

来自分类Dev

\ d和\ d +之间有区别吗?

来自分类Dev

is和isKindOfClass()之间有区别吗?

来自分类Dev

列表和元组之间有区别吗?

来自分类Dev

$ @和“ $ @”之间有什么区别吗?

来自分类Dev

-1和〜0之间有区别吗?

来自分类Dev

sas和+之间有区别吗?

来自分类Dev

TRUE和TRUE之间有区别吗?

来自分类Dev

celldoubleclick和cellmousedoubleclick之间有区别吗?

来自分类Dev

.change()和.on(“ change”)之间有区别吗?

来自分类Dev

“ if let”和“ if”之间有区别吗?

来自分类Dev

##(lambda ...`和`(lambda ...`之间有区别吗?

来自分类Dev

CLI和TUI之间有区别吗?

来自分类Dev

WAMP和MYSQL之间有区别吗

来自分类Dev

“ a = b”和“ a = $ b”之间有区别吗?

来自分类Dev

$('#id')和$(id)之间有区别吗?

来自分类Dev

TRUE和TRUE之间有区别吗?

来自分类Dev

.JPG和.jpg之间有区别吗?

来自分类Dev

PHP:{$ foo}和$ {foo}之间有区别吗

来自分类Dev

MASM Shellcode和NASM Shellcode之间有区别吗

来自分类Dev

Ant JUnit任务:on,yes和true之间有区别吗?

来自分类Dev

dataWithContentsOfURL(线程)和dataTaskWithURL之间有什么区别吗?

来自分类Dev

iostream.h和iostream之间有区别吗

来自分类Dev

引发Exception类和Exception实例之间有区别吗?

来自分类Dev

ISR和中断处理程序之间有区别吗?

来自分类Dev

Arrays.fill和实际填充之间有区别吗

来自分类Dev

类型和类之间有什么区别吗?

来自分类Dev

== null和.equals(“ null”)之间有什么区别吗?

Related 相关文章

热门标签

归档