我目前正在开发一些python代码,以从14000 pdfs (每pdf 7 Mb )中提取数据。它们是由Adobe设计器11.0生成的动态XFA,因此它们包含需要稍后解码的流(因此,如果有任何区别的话,还有一些非ascii字符)。
我的问题是,对这些文件调用open()需要大约1秒的时间(如果不是更长的话)。
我对通过复制粘贴字符创建的13 to文本文件进行了相同的操作,它们的打开时间不到0.01秒。当我用()打开动态pdfs时,这一次的增长从何而来?我能避免这个瓶颈吗?
我用cProfile得到了这样的时间:
from cProfile import Profile
profiler = Profile()
profiler.enable()
f = open('test.pdf', 'rb')
f.close()
profiler.disable()
profiler.print_stats('tottime')对于给定的xfa,print_stats的结果如下:io.open()只需1秒执行一次
附加信息:我注意到,当在最后15或30分钟内打开相同的pdf文件时,打开时间大约快了10倍,即使我删除了项目中的__pycache__目录。一个可以使这种速度提高的解决方案,无论经过多少时间,都是值得的,尽管我的pc上只剩下50 Gb。同时,对pdfs的并行处理也不是一个选项,因为我只有一个空闲的核心来运行我的实现.
发布于 2021-03-20 06:01:57
要解决这个问题,您可以执行以下操作之一:
real time protection。正如"user2357112支持莫妮卡“在评论中所说的那样,罪魁祸首是反病毒软件在向python提供文件之前扫描这些文件。
我能够通过在打开任务管理器时调用文件列表上的open()来验证这一点。Python使用了几乎0%的CPU,而Service antivirus Microsoft Defender正在使我的一个核心变得最大。
我将结果与我的脚本的另一次运行进行了比较,在脚本中,我多次打开同一个文件,python在反病毒保持在0%的情况下使内核变得强大。
我试图运行一个单一的pdf文件2次快速扫描与Windows维护者.第一次执行导致在1秒内扫描800个文件(因此open()执行延迟了1秒),第二次扫描立即导致一个扫描文件。
Explication:
Windows Defender扫描所有写在文件夹中的文件/互联网链接,这就是为什么扫描它们花费了这么长时间,这也是为什么在第一次报告中扫描了大约800个文件。保存了一个文件缓存扫描,因为打开了个人电脑。没有链接到互联网的文件不需要被Windows重新扫描。但是XFA包含到网站的链接。因为不可能知道网站是否被恶意修改,所以包含这些内容的文件需要定期重新包装,以确保它们仍然安全。
https://stackoverflow.com/questions/66718358
复制相似问题