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

C# 如何使用字典解决WP7中的内存不足异常?,c#,silverlight-4.0,windows-phone-7,exception-handling,dictionary,C#,Silverlight 4.0,Windows Phone 7,Exception Handling,Dictionary,我在WP7中构建了一个应用程序,需要加载大约20000个硬编码数据({'a',“XYZ”},{'b',“mno”},…),我必须在这些数据上执行搜索。因此,我试图通过创建一个字典,将“a”作为键,将值作为“XYZ”来实现这一点。我的字典一填好,就会出现内存不足的异常。 考虑到我正在构建WP7应用程序,如何解决这个问题? 或者除了使用字典还有别的方法吗 每当你在手机上加载这么多数据时,你都是做错了。首先,带宽问题将扼杀你的应用程序。其次,内存问题已经杀死了你的应用程序。第三,CPU问题将杀死你的应

我在WP7中构建了一个应用程序,需要加载大约20000个硬编码数据({'a',“XYZ”},{'b',“mno”},…),我必须在这些数据上执行搜索。因此,我试图通过创建一个字典,将“a”作为键,将值作为“XYZ”来实现这一点。我的字典一填好,就会出现内存不足的异常。 考虑到我正在构建WP7应用程序,如何解决这个问题?
或者除了使用字典还有别的方法吗

每当你在手机上加载这么多数据时,你都是做错了。首先,带宽问题将扼杀你的应用程序。其次,内存问题已经杀死了你的应用程序。第三,CPU问题将杀死你的应用程序。结论是,你的用户最终杀死了你的应用程序

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

如果你坚持要在手机上处理这么多数据,首先要设法控制下载量。请记住,这里指的是移动电话,并非所有地方都有最高3G速度。尽量压缩数据结构(例如,使用树存储常用前缀)。在下载之前,请尝试压缩数据

然后积极统计每个对象的内存使用情况。输入20000个字符串很容易消耗大量内存。您希望尽可能减少每个对象内存使用的大小。在您的示例中,您只是将字符串放在那里,因此我无法猜测您将如何使用WP7应用程序上允许的数十MB。但是,如果您不仅要放置字符串,还要放置大型对象,请计算字节数


此外,积极管理碎片化。您最不想做的事情是
newdictionary()
然后
dict.Add(x,y)在for循环中。当字典的内部表空间满时,它会被分配到一个新位置,整个字典会复制到新位置,从而浪费原始空间。你最终会有很多零碎的内存空间。做一个
新字典(20000)
或者做一些事情,一次就先保留空间。

你可以将它存储在
数据库中,只获取所需的数据。这样你就可以存储任意数量的数据

编辑


用户端不需要任何额外的内容。您可以使用,将此连接到项目。首次使用时将DB复制到独立存储。您可以随时访问DB。检查此链接。此链接使用sqlitewindowsphone而不是WP7Sqlite。我更喜欢使用sqlitewindowsphone,因为我在使用sqlitewindowsphone时出错。

我的应用程序不是基于web的。它将安装在手机上。那么该怎么办呢?在这种情况下,如果数据是静态的(这意味着你将下载一次并永远在那里,因此下载所需的时间并不重要),那么你必须找出为什么要使用这么多内存。如果您使用的是30MB,那么30MB/20000对象=每个对象1.5KB。那是一个相当大的物体。也请考虑我的优化想法。谢谢你的回复。是的,我必须寻找优化问题。我的文本文件也可以在应用程序中提供。是否可以将文本文件添加到项目中,然后以读取模式打开该文件。然后搜索文件中的文本,并从文件中获取文本的对应值。这样我们就不会一次将整个文件数据加载到应用程序中。我们可以分段读取文件吗?我不认为你可以在程序中嵌入资源而不加载它。但是,您可以将该文件作为单独的资源包含。不确定是否可以分段阅读。你真正需要的是一个数据库——Silverlight和WP7中都有使用的数据库。搜索“WP7数据库”,你会发现很多。是的,我同意。但是,除了应用程序之外,是否需要在用户端进行一些额外的安装,并且更多的安装将满足开发端的要求。