首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >唱片回忆录

唱片回忆录
EN

Stack Overflow用户
提问于 2015-07-02 14:05:08
回答 3查看 1.3K关注 0票数 5

我希望改进返回大小调整的图像的函数的性能。所请求的图像大小不应该有很大的变化(设备依赖的),因此以某种方式缓存结果是有意义的。

当然,我可以将其存储在磁盘上,并检查是否存在调整大小的映像,并确保如果删除原始图像,调整大小的版本也是.

或者,我需要一个回忆录功能。但是由于结果可能相当大(我认为一个图像大约是5-10 MB ),所以将它们存储在内存中是没有意义的(几十个GB图像及其修改后的版本会很快地填满内存)。

那么,是否有一种方法可以让回忆录函数像常规的Clojure defmemo那样运行,但它是由本地磁盘中的文件夹而不是内存支持的呢?然后,我可以使用ttl策略来确保图像保持不同步的时间太长。

类似于克什,但有文件系统支持的东西?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-03 13:23:55

别想太多了。您的文件系统作为缓存是正确的想法。如果一个文件很受欢迎,并且该文件经常被访问,那么您的操作系统将确保它在RAM中。这是许多数据库使用的相同策略。例如,Elasticsearch要求您留出足够的RAM,以便在RAM中拥有Lucene索引文件。

也不要修改你的文件!用功能的方式来做:把它们当作不可变的数据。您的输入文件不应该更改。如果是这样,那就是一个新的文件。硬盘空间越来越便宜。不要害怕有很多文件散落在周围。如果必须的话,您可以进行垃圾回收,在一段时间后删除旧的/标记的文件。

要查看文件是否在缓存中,只需检查文件是否存在。如果不是,你只写一次。

因此,总结一下:

  • 让您的O/S运行缓存。
  • 不要编辑你的文件。将它们视为不可变的数据。写一次
  • 您的O/S将释放未使用文件的RAM。硬盘空间非常便宜。
票数 4
EN

Stack Overflow用户

发布于 2015-07-03 13:19:02

为什么不从clojure.core.cache实现一个TTL-缓存,用您需要的功能包装它呢?您的键可以是任何标识您调整大小的图像,其值将是它在磁盘上的位置。然后,您可以实现某种获取或设置!函数,传递给它在图像不存在时被调用以生成图像的函数。例如:

代码语言:javascript
复制
(def Cache (atom (cache/ttl-cache-factory {} :ttl 20000)))

(defn get-or-update!
  "wraps the recommended has-hit-get pattern
   https://github.com/clojure/core.cache/wiki/Using"
  [key fn]
  (if (cache/has? @Cache key)
    (get (swap! Cache #(cache/hit % key)) key)
    (get (swap! Cache #(cache/miss % key (fn))) key)))
票数 2
EN

Stack Overflow用户

发布于 2015-07-02 17:51:43

你所需要的听起来像是数据体的完美使用。它很容易从Clojure上使用,效率很高,就像任何好的DB一样,它在内存中有一个最近使用的(LRU)缓存。它还可以使用各种各样的后台数据库作为基板,从严格的内存中(最好用于测试和实验)到Postgres、Redis、DynamoDB、Riak等。还有一种"dev“模式,用于所有存储的本地文件。

请参阅此处的所有详细信息:

  • 数据体
  • 数据体"dev“模式

有一个标准版本,有一个免费的,永久许可,适合于大多数用途。对于高级特性,可以使用付费版本。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31186791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档