Clojure - 在磁盘上记忆

nha*_*nha 5 caching clojure memoization

我想提高返回调整大小图像的函数的性能。请求的图像大小不应有太大变化(取决于设备),因此以某种方式缓存结果是有意义的。

我当然可以将它存储在磁盘上,并检查调整后的图像是否存在,并确保如果原始图像被删除,调整后的版本太......

或者,我可以使用记忆功能。但是由于结果可能很大(我认为图像大约为 5 - 10 MB),将它们存储在内存中是没有意义的(几十 GB 的图像及其修改版本会很快填满内存)。

那么,有没有办法让记忆功能类似于常规 Clojure defmemo,但由本地磁盘中的文件夹而不是内存支持?然后我可以使用一种ttl策略来确保图像不会长时间不同步。

类似于crache,但由文件系统支持的东西?

Clo*_*tly 4

别想太多。将文件系统作为缓存是正确的想法。如果一个文件变得流行并且该文件被大量访问,那么您的操作系统将确保它位于 RAM 中。这与许多数据库使用的策略相同。例如,Elasticsearch 要求您留出足够的 RAM,以便将 Lucene 索引文件保留在 RAM 中。

也不要修改您的文件!以函数式方式进行:将它们视为不可变数据。您的输入文件不应更改。如果是,那么它是一个新文件。硬盘空间非常便宜。不要担心周围有很多文件。如果必须,您可以执行垃圾收集,在一段时间后删除旧的/标记的文件。

要查看文件是否在缓存中,您只需检查该文件是否存在即可。如果不是:您只写一次。

总结一下:

  • 让您的操作系统进行缓存
  • 不要编辑您的文件。将它们视为不可变数据。写一次
  • 您的操作系统将释放 RAM 中未使用的文件。硬盘空间超级便宜。