gpt4 book ai didi

python - PyPDF2:在内存中连接pdf

转载 作者:行者123 更新时间:2023-12-04 15:52:02 25 4
gpt4 key购买 nike

我希望在纯 python 的内存中有效地连接(附加)一堆小pdf。具体来说,通常的情况是将 500 个单页 pdf,每个大小约为 400 kB,合并为一个。假设 pdf 可作为内存中的可迭代对象使用,比如一个列表:

my_pdfs = [pdf1_fileobj, pdf2_fileobj, ..., pdfn_fileobj]  # type is BytesIO

其中每个 pdf_fileobj 的类型为 BytesIO。然后,基本内存使用量约为 200 MB(500 个 pdf,每个 400kB)。

理想情况下,我希望以下代码使用总共不超过 400-500 MB 的内存(包括 my_pdfs )进行连接。然而,情况似乎并非如此,最后一行的调试语句表明过去的最大内存几乎为 700 MB。此外,使用 Mac os x 资源监视器,当到达最后一行时,分配的内存显示为 600 MB。

运行 gc.collect()将其减少到 350 MB(几乎太好了?)。在这种情况下,为什么我必须手动运行垃圾收集来摆脱合并垃圾?我已经看到这(可能)导致内存在略有不同的情况下积累,我现在将跳过。
import PyPDF2
import io
import resources # For debugging

def merge_pdfs(iterable):
''' Merge pdfs in memory '''
merger = PyPDF2.PdfFileMerger()
for pdf_fileobj in iterable:
merger.append(pdf_fileobj)

myio = io.BytesIO()
merger.write(myio)
merger.close()

myio.seek(0)
return myio

my_concatenated_pdf = merge_pdfs(my_pdfs)

# Print the maximum memory usage
print('Memory usage: %s (kB)' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)

问题总结
  • 为什么上面的代码需要将近 700 MB 的内存来合并值(value) 200 MB 的 pdf? 400 MB + 开销还不够吗?我该如何优化它?
  • 当有问题的变量应该已经超出范围时,为什么我需要手动运行垃圾收集来摆脱 PyPDF2 合并垃圾?
  • 这种通用方法怎么样? BytesIO 是否适合使用这种情况? merger.write(myio)考虑到一切都发生在 ram 中,似乎运行速度有点慢。

  • 谢谢!

    最佳答案

    问:为什么上面的代码需要将近 700 MB 的内存来合并值(value) 200 MB 的 pdf? 400 MB + 开销还不够吗?我如何优化它?

    答:因为.append创建一个新的流对象,然后使用 merger.write(myio) ,这会创建另一个流对象,并且内存中已经有 200 MB 的 pdf 文件,因此为 3*200 MB。

    问:当有问题的变量应该已经超出范围时,为什么我需要手动运行垃圾收集来摆脱 PyPDF2 合并垃圾?

    - 答:这是一个已知的issue在 PyPDF2 中。

    问:这个一般方法怎么样? BytesIO 是否适合使用这种情况?

    A:考虑到内存问题,您可能想尝试不同的方法。也许一一合并,暂时将文件保存到磁盘,然后从内存中清除已经合并的文件。

    关于python - PyPDF2:在内存中连接pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45662765/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com