如何使用字典解决WP7中的内存不足异常?

时间:2011-03-28 04:51:46

标签: c# silverlight-4.0 windows-phone-7 exception-handling dictionary

我在WP7中构建了一个应用程序,我需要加载大约20000个硬编码数据({'a',“XYZ”},{'b',“mno”},....)执行搜索。因此,我试图通过创建一个字典,使'a'作为键,值为“XYZ”。一旦我的字典被填满,它就会给出Out of memory异常。 考虑到我正在构建WP7应用程序,我该如何解决这个问题? 或者除了使用字典之外还有其他方法吗?

2 个答案:

答案 0 :(得分:6)

每当您将大量数据加载到手机时,您就错了。首先,带宽问题会破坏你的应用程序。其次,内存问题已经杀死了你的应用。第三,CPU问题会杀死你的应用程序。结论是,您的用户最终会杀死您的应用。

推荐的解决方案:找到一种对数据进行分类的方法,以便不是所有数据都必须下载到手机上。在您所属的服务器上进行处理(而不是在手机上)。

如果您坚持在手机上处理如此多的数据,请先尝试管理下载大小。记住你在这里谈论的是手机,并不是所有地方都有最高3G的速度。尝试尽可能地压缩数据结构(例如,使用树来存储公共前缀)。也请在下载前尝试压缩数据。

然后积极计算每个对象的内存使用量。放入20,000个字符串很容易消耗大量内存。您希望尽可能减少每个对象内存使用量的大小。在你的例子中,你只是在那里放置字符串,所以我无法猜测你如何使用WP7应用程序允许的几十MB。但是,如果您不只是放置字符串,而是放置大对象,请计算字节数。

此外,积极管理fragementation。您要做的最后一件事是在for循环中new Dictionary()然后dict.Add(x,y);。当字典的内部表空间运行时,它将被分配到一个新的位置,整个字典被复制到新的位置,浪费了原始空间。你最终会有很多碎片化的内存空间。做一个new Dictionary(20000)或者其他东西,一次性保留空间。

答案 1 :(得分:1)

不是将其作为Dictionary存储在内存中,而是可以将其存储在Databasewp7sqlite)中,并仅获取所需的数据。这样,您可以存储任何数量的数据。

修改

用户端额外不需要任何内容​​。您可以使用sqlite manager创建数据库,将其附加到项目。第一次使用时将数据库复制到隔离存储。您可以随时访问数据库。检查此链接DB helper。此链接使用sqlitewindowsphone而不是WP7Sqlite。我更喜欢wp7sqlite因为我使用sqlitewindowsphone时出错。