如何在没有内存溢出的情况下按需访问数千个图像

时间:2013-04-07 19:44:48

标签: c# winforms visual-studio memory-management out-of-memory

我从数据库中下载了大约5,000张图像,这些图像都代表目录中的某些对象。
目录显示在ListView( Telerik )中,但我希望图像显示在每个列表视图项旁边。

显然有这么多的图像,如果我把它们放在内存中,我肯定会耗尽内存,我甚至都不会尝试。

我的问题是: 我可以通过其他方式实现此功能吗?

用户可以随意滚动浏览所有项目。我想我可以在列表视图中实现页面并加载页面更改,但我们可以将其作为最后的手段。

环境: 赢7 64位 Visual Studio 2010专业版 C# Telerik WinForms

编辑1 我被要求提供一个我想要这样的图像。这是一个很好的例子。正如这个图像我将能够将视图状态更改为详细信息视图或图标视图等。就像Windows资源管理器一样。 您可以在此处找到图片:http://imgur.com/huEw4B6

1 个答案:

答案 0 :(得分:4)

你必须实现分页,没有别的办法。您可以使用:

  • 下一步上一页第N页模式。这适用于关系数据库
  • 获取更多。这适用于NoSQL数据库,其中Count是一项代价高昂的操作

从可用性的角度来看,没有人真正需要5000件物品。这就是人们发明搜索的原因。从内存管理,您只能存储尽可能多的内存。当然,有一些交换和内存分页的技巧,但这不能很好地扩展。

如果您关注实时搜索而不是更复杂。

共同点

任何搜索工作都很快,因为数据已编入索引,或者换句话说是已排序。如果数据已排序,您可以使用binary search,这是O(Log(N))操作。

客户端搜索

如果您有5000个项目,在客户端将城市称为字符串,则可以在本地缓存该数据,对其进行一次排序,并运行快速搜索查询。

您还可以在图像标签上发明搜索,并将图像标签/描述存储在内存中。

此方法仅限于小数据。当您达到限制时,无法扩展它,您必须在服务器上运行搜索查询

服务器端搜索

如果无法使用客户端过滤,请在服务器上执行此操作。这将在很大程度上取决于您的引擎。关系数据库将提供索引列,全文搜索索引等。 NoSQL数据库将提供索引(以及二级索引,宽行,全文搜索字段等)。

您可以提出另一个问题,包括您使用的堆栈。我建议停止使用客户端搜索并寻找可扩展的服务器端选项,因为它可以在1 MB,1 GB,1 TB甚至1PB规模上工作(尽管需要付出更多努力)。