【问题标题】:How to access thousands of images on demand without memory overflow [closed]如何在没有内存溢出的情况下按需访问数千张图像[关闭]
【发布时间】:2013-04-07 19:44:47
【问题描述】:

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

显然,有这么多图像,如果我将它们放入内存中,我肯定会耗尽内存,我什至不会尝试。

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

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

环境: 赢7 64位 视觉工作室 2010 专业版 C# Telerik WinForms

编辑 1 我被要求提供一张我希望它看起来如何的图像。这是一个很好的例子。就像这个图像我将能够将视图状态更改为详细信息视图或图标视图等。就像 Windows 资源管理器一样。 你可以在这里找到图片:http://imgur.com/huEw4B6

【问题讨论】:

  • 可以发截图吗?只是想知道你需要什么。图片大小等。如果您无法在此处发布图片,请尝试imgur.com
  • 我只是在上面的图片上放了一个链接。

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


【解决方案1】:

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

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

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

如果您关心的是实时搜索,那么它会变得更加复杂。

共同点

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

客户端搜索

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

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

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

服务器端搜索

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

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

【讨论】:

  • 如果我想要实时搜索怎么办?分页会使这更加乏味。 Telerik 的 ListView 已经支持对其数据绑定源进行实时过滤,但是如果数据绑定源不能同时保存所有记录,那么我无法搜索不在当前页面上的记录,不是吗?如果您的情况是唯一的方法,那么我正在考虑拥有两个数据源?一个持有所有 5,000 条记录及其各自的成员,并绑定到列表视图。然后将列表视图拆分为页面,并在页面更改事件中下载显示项目的图像。这样搜索
  • 实时过滤所有项目 5,000 个项目。我想,过滤中加载的图像会很笨重。
  • 嗯,对于我的场景,在显示任何结果之前强制进行搜索然后从那里过滤似乎更合理。我的列表视图应该提供多种选择,这就是我想要实时过滤以使其看起来“流畅”和“有吸引力”的主要原因。猜猜我会去计划B,服务器端搜索。谢谢 oleksii
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2015-11-29
  • 2021-02-01
  • 2019-11-21
  • 1970-01-01
相关资源
最近更新 更多