我已经确认genfromtxt函数(以及从它派生的函数)以静默方式将它们正在处理的远程文件缓存在本地目录中,并在后续调用中使用本地副本,而无需检查它是否已更改。
通过查看源文件npyio.py,似乎发生了这种情况,因为在不传递相关参数的情况下创建了处理请求的DataSource对象。
当然,修改库源以禁用缓存很容易,但是随后每次升级后我都必须重复一遍。
还有其他解决方案吗? (除了每次删除缓存目录之外)
最佳答案
我认为这个问题实际上由两部分组成:
genfromtxt
的缓存行为? 关于1.,包装(可能是通过注入(inject))比修补库更具弹性(除非修补是在库的仓库中在上游完成)。
所以包装
genfromtxt
可以像这样完成:def patched_gen_from_text(*args, **kwargs):
# Do something regarding caching
return numpy.genfromtxt(*args, **kwargs)
您甚至可以在不修改源代码的情况下将其作为numpy.genfromtext注入(inject)(不是我建议这样做):
import numpy
numpy.genfromtxt = patched_gen_from_text
关于2.它实际上取决于您对远程文件系统的访问权限(例如,您可以在其中运行过程吗?是否可以挂载它?),以及所需的速度和确定性之间的权衡。
例如,在一种极端情况下,您的修补版本可能无条件擦除本地文件(某些但速度很慢)。或者,您也许可以请求远程文件的更新时间和长度,并查看它们与本地文件的对应关系。在另一个极端,您可能能够在另一台计算机上的RPC上运行md5检查。
您可能需要检查filecmp的不同比较选项,以及某些情况下可能的实际构造块。