最佳数据存储内存使用?

Posted

技术标签:

【中文标题】最佳数据存储内存使用?【英文标题】:Optimal data store memory usage? 【发布时间】:2012-07-25 18:38:45 【问题描述】:

我正在构建一个数据存储,以跟踪存储在我的应用中的所有远程图像。我决定使用单例来跟踪所有被引用的图像。

我记得,ios 会根据最近的使用情况自动开始从内存中清除对象,无论它是否被当前视图控制器引用等等。但是,如果我将这些图像存储在数据存储中,这些对象总是被商店本身引用。我的内存管理解决方案是跟踪上次调用图像的时间,并对存储在数据存储中的图像的数量和大小保持某种形式的限制,并根据年龄清除最旧的图像。

这个解决方案好不好?为什么或者为什么不?我应该依赖 Apple 的自动内存管理,还是让我自己的管理器好吗?

进一步解释:

以下是从我的一个视图控制器请求图像最终将如何使用我的解决方案:

[[HollerImages store]getImageWithUrl:@"https://www.google.com/logos/classicplus.png" 
                     completionBlock:^(BOOL succeeded, UIImage *image)
                        if( succeeded )
                            //Update the UIImageView with the returned image
                        
                     ];

然后,商店将管理应用程序中当前引用的图像数量,并在我们达到某个预定义的限制时自动取消引用旧图像。想法?

【问题讨论】:

«我记得,iOS 会根据最近的使用情况自动开始从内存中清除对象,» 不清楚你在说什么。 iOS 将清除 应用程序(已被后台处理),但它不会直接触及单个应用程序的内存空间。它会发送“警告”,有责任通过您认为最好的方案减少使用量。 知道了...但是内存使用有限制,不是吗?如果超过这个限制会发生什么?据我所知,你不能忽视警告。 限制是动态的——它取决于正在发生的事情。如果存在内存压力,系统会向正在运行的进程发送内存警告,然后(如果它没有恢复足够的内存)开始清除后台应用程序。如果仍然无法找到足够的内存,您的应用程序将被终止,恕不另行通知。您确实可以忽略这些警告,但后果自负。不过,操作系统从不管理您的对象——它只在整个进程级别上工作。 【参考方案1】:

Renaud Boisjoly (@rboisjoly) 刚刚向我发送了一个指向此库的链接,该链接似乎提供了我所描述的解决方案:https://github.com/rs/SDWebImage/

【讨论】:

【参考方案2】:

处理内存问题的最简单方法是实现-(void)didReceiveMemoryWarning 函数并清除那里的所有缓存数据。

您所说的是实现过​​期缓存。您可以在每次插入时计算数据结构中的元素,并在达到限制时从头部删除元素(前提是它是有序的数据结构)。前一种解决方案更简单,并且在大多数情况下都有效。

【讨论】:

以上是关于最佳数据存储内存使用?的主要内容,如果未能解决你的问题,请参考以下文章

本地内存中的 RGBA 数据布局,可减少存储库冲突

NodeJS 存储基于文件的 JSON 数据库的最佳方式?

redis集群简介

使用缓存保护MySQL

使用缓存保护MySQL

如何最佳地使用memcached?