python – PyPDF2:在内存中连接pdfs
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – PyPDF2:在内存中连接pdfs,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1958字,纯文字阅读大概需要3分钟。
内容图文
![python – PyPDF2:在内存中连接pdfs](/upload/InfoBanner/zyjiaocheng/964/29e0b6c7f8c54715b40cb7c4b2a0e5ef.jpg)
我希望在纯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的内存来合并200 MB的pdfs?不应该400 MB的开销就足够了吗?我该如何优化它?
>当有问题的变量已经超出范围时,为什么我需要手动运行垃圾收集以摆脱PyPDF2合并垃圾?
>这种一般方法怎么样? BytesIO适合使用是这种情况吗? merger.write(myio)看起来确实有点慢,因为所有都发生在ram中.
谢谢!
解决方法:
问:为什么上面的代码需要几乎700 MB的内存来合并200 MB的pdfs?不应该400 MB的开销就足够了吗?我该如何优化它?
答:因为.append创建了一个新的流对象,然后你使用了merger.write(myio),它创建了另一个流对象,你已经在内存中有200 MB的pdf文件,所以3 * 200 MB.
问:当有问题的变量已经超出范围时,为什么我需要手动运行垃圾收集以摆脱PyPDF2合并垃圾?
答:这是PyPDF2中已知的issue.
问:这种一般方法怎么样? BytesIO适合使用是这种情况吗?
答:考虑到内存问题,您可能想尝试不同的方法.也许可以逐个合并,暂时将文件保存到磁盘,然后从内存中清除已经合并的文件.
内容总结
以上是互联网集市为您收集整理的python – PyPDF2:在内存中连接pdfs全部内容,希望文章能够帮你解决python – PyPDF2:在内存中连接pdfs所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。