Python:为什么打开XFA pdf文件要比打开相同大小的txt文件花费更长的时间



我目前正在开发一些python代码,以从14000个pdf文件中提取数据(每个pdf文件7 Mb(。它们是由Adobe LiveCycle Designer 11.0制作的动态XFA,因此它们包含稍后需要解码的流(因此,如果有任何不同,则会有一些非ascii字符(。

我的问题是,对这些文件调用open((每个文件大约需要1秒的时间。

我在复制粘贴字符创建的13Mb文本文件上尝试了同样的操作,它们打开不到0.01秒当我用open((打开动态pdf时,这个时间增量是从哪里来的?我能避免这个瓶颈吗

我用cProfile得到了这样的时间:

from cProfile import Profile
profiler = Profile()
profiler.enable()
f = open('test.pdf', 'rb')
f.close()
profiler.disable()
profiler.print_stats('tottime')

对于给定的xfa-pdf,print_stats的结果如下:io.open((执行一次大约需要1秒

附加信息:我注意到,当在过去的15或30分钟内打开同一个pdf文件时,即使我删除了项目中的__pycache__目录,打开时间也会快10倍左右。尽管我的电脑上只剩下50 Gb,但一个可以让这种速度提高的解决方案是值得的。此外,pdfs的并行处理不是一个选项,因为我只有一个可用的内核来运行我的实现。。。

要解决此问题,您可以执行以下操作之一:

  • 指定要从Windows Defender设置中排除(无实时扫描(的文件/目录/扩展名
  • 暂时关闭Windows Defender中的real time protection
  • 将文件保存为Windows Defender无法检测到指向其他文件/网站的链接并在读取时对其进行解码的编码格式。(我没有尝试过(

As";用户2357112支持monica";评论中说,罪魁祸首是杀毒软件在将文件提供给python之前先扫描文件。

在打开任务管理器的同时,我可以通过在文件列表上调用open()来验证这一点。Python使用了几乎0%的CPU,而Service antivirus Microsoft Defender最大化了我的一个核心。

我将结果与我的另一次脚本运行进行了比较,在脚本运行中,我多次打开同一个文件,python的核心功能被最大化,而防病毒功能保持在0%。

我试着用Windows Defender对一个pdf文件进行两次快速扫描。第一次执行导致在1秒内扫描800个文件(因此open()执行延迟1秒(,第二次扫描导致立即扫描一个文件。

说明:

Windows Defender扫描文件夹中写入的所有文件/互联网链接,这就是为什么扫描它们需要这么长时间,也是为什么第一份报告中扫描了大约800个文件。Windows defender保存了电脑开机后扫描的文件缓存。未链接到互联网的文件不需要Windows defender重新扫描。但是XFA包含指向网站的链接。由于无法判断网站是否被恶意修改,因此需要定期重新扫描包含这些文件的文件,以确保它们仍然安全。

这是到Microsoft官方论坛的链接。

最新更新