【问题标题】:Difference between reading from file and MongoDB GridFS?从文件读取和 MongoDB GridFS 之间的区别?
【发布时间】:2014-12-23 08:43:28
【问题描述】:

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

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 中获取文件或从文件系统中获取文件会返回相同的结果(它在浏览器中呈现相同的结果),但显然它不一样。

有谁知道这两者之间的区别是什么导致这个调用需要这么长时间,更重要的是我该如何解决它?欢迎所有提示!

【问题讨论】:

    标签: python mongodb pdf gridfs pdfminer


    【解决方案1】:

    回答我自己的问题:事实证明,因为字符串是在 Python 中实习的,这意味着任何字符串操作都会创建新的字符串,如果您有数兆字节的字符串(即重复复制一个要处理成新字符串的字符串会出现这样的减速)。

    显然,这凸显了 pdfminer 库编写得很糟糕的事实。所以我有两个选择:

    1. 编辑 pdfminer 库并发送拉取请求。
    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 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多