缓存注意事项
缓存注意事项
Numba支持将编译后的函数缓存到文件系统中,以供将来使用相同的函数。
实施
通过保存编译后的目标代码(可执行代码的ELF对象)来完成缓存。通过使用目标代码,由于不需要编译,因此缓存的函数具有最小的开销。缓存的数据保存在缓存目录下(请参阅NUMBA_CACHE_DIR)。缓存的索引存储在.nbi文件中,每个函数有一个索引,并且列出了为该函数编译的所有load重载签名。每load过载一个文件,目标代码被存储在具有.nbc扩展名文件中。两个文件中的数据都以pickle序列化。
注意
在Python <= 3.7上,Numbapickle使用纯Python Pickler进行扩展。要使用速度更快的C Pickler,请 从pip安装pickle5。pickle5向后移植Python 3.8 Pickler功能。
缓存要求
开发人员应注意允许缓存功能的要求,以确保正在使用的功能与缓存兼容。
可缓存功能的要求:
- LLVM模块必须是独立的,这意味着如果不链接到其它已编译的单元,则它不能依赖其它模块。
- 唯一允许的外部符号来自 NRT或系统库中的其它常见符号(即libc和libm)。
调试说明:
- inttoptr在LLVM IR或 target_context.add_dynamic_add()Python的降低代码中查找的用法。指示运行时runtime地址的潜在用途。并非所有用途都是有问题的,有些用途是必需的。仅将常量整数转换为指针会影响缓存。
- 错误使用动态地址或动态标志可能会导致段错误。
- 链接顺序很重要,因为链接后会删除未使用的符号。链接应从依赖关系图的叶节点开始。
与缓存兼容的功能
明确验证了以下功能可用于缓存。
- cpu和parallel目标的ufuncs和gufuncs
- 并行加速器功能(即parallel=True)
缓存限制
这是缓存的已知限制的列表:
- 缓存无效。无法识别在另一个文件中定义的符号中的更改。
- 全局变量被视为常量。缓存将保存编译时使用的全局变量中的值。在缓存加载时,缓存的函数将不会重新绑定到全局变量的新值。
缓存共享
在另一台计算机上共享和重用缓存目录中的内容是安全的。缓存会在编译过程中记录CPU模型和可用的CPU功能。如果CPU型号和CPU功能不完全匹配,则不会考虑缓存内容。(参阅NUMBA_CPU_NAME)
如果高速缓存目录在网络文件系统上共享,仅当文件替换操作是文件系统的原子操作时,并发读取/写入高速缓存才是安全的。Numba始终首先写入唯一的临时文件,然后用该临时文件替换目标缓存文件路径。Numba可以容忍丢失的缓存文件和丢失的缓存条目。
缓存清除
修改相应的源文件后,缓存将失效。但是,有时有需要手动清除缓存目录。例如,由于未修改源文件,因此无法识别编译器中的更改。
要清除缓存,可以简单地删除缓存目录。
在运行Numba应用程序时,删除缓存目录可能会导致 OSError在编译站点引发异常。
缓存注意事项
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)