我有一个很简单的问题,我不能相信我自己也不能回答。 但是,你去了。
我在Windows Phone 7 Silverlight应用程序中使用了大量的静态列表(城市,纬度和经度)。 大约有一万个 我想将这些数据静态地embedded到我的应用程序中,并以数组的forms访问它(我需要定期在代码中循环遍历整个列表)。
什么是我最有效的存储方式? 我有点老派,所以我认为最快的方法是:
public struct City { public string name; public double lat; public double lon; };
接着…
private City[] cc = new City[10000]; public CityDists() { cc[2].name = "Lae, Papua New Guinea"; cc[2].lat = 123; cc[2].lon = 123; cc[3].name = "Rabaul, Papua New Guinea"; cc[3].lat = 123; cc[3].lon = 123; cc[4].name = "Angmagssalik, Greenland"; cc[4].lat = 123; cc[4].lon = 123; cc[5].name = "Angissoq, Greenland"; cc[5].lat = 123; cc[5].lon = 123; ...
然而,在代码实际运行之前,这个“内存不足”的错误会让人感到厌倦(我假设代码本身过多地加载到内存中)。
我在网上阅读的所有内容都告诉我要使用XML资源或文件,然后将其反序列化为类的实例。 但是,真的可以像使用结构一样快吗? XML不会花费时间来parsing吗?
我认为我有能力在这里编写代码 – 我只是不确定最好的方法是从什么开始。 我对加载速度和(更重要的)运行时间访问速度感兴趣。
任何帮助非常感谢 – 在这里的第一个问题,所以我希望我没有做任何事情头脑。
克里斯
如果从XAP加载一个XML文档为你工作..
这里是我发布的一个项目,演示了如何通过XDocument / LINQ从数据绑定到数据绑定的XML文档加载到一个列表框供参考。
将Linq数据源绑定到列表框
10,000结构不应该耗尽内存,但只是为了确保,我会首先尝试把你的结构变成一个类,使用堆而不是堆栈。 这样做很有可能会解决你的内存不足错误。
存储在独立存储中的XML文件可能是一个好方法,如果您的数据即将每隔一段时间更新一次。 您可以从Web服务中抽取城市,并在更新时将这些类序列化到独立存储中的应用程序商店。
另外,我注意到代码示例cc
数组没有被声明为静态的。 如果您有几个CityDists
实例,那么也可能会让内存陷入困境,因为每当创建一个新的CityDists
类时,都会重新创建该数组。 尝试将你的数组声明为static,并在静态构造函数中初始化它:
private static City[] cc = new City[10000]; static CityDists() { cc[2].name = "Lae, Papua New Guinea"; cc[2].lat = 123; cc[2].lon = 123; cc[3].name = "Rabaul, Papua New Guinea"; cc[3].lat = 123; cc[3].lon = 123; cc[4].name = "Angmagssalik, Greenland"; cc[4].lat = 123; cc[4].lon = 123; cc[5].name = "Angissoq, Greenland"; cc[5].lat = 123; cc[5].lon = 123; ...
如果你想避免XML解析和内存开销,你可以使用纯文本文件来存储数据,并使用.Net字符串标记器函数来解析条目,例如使用String.Split()
您也可以部分加载文件以保持内存消耗低。 例如,只加载文件的n行中的k个。 如果您需要访问当前加载的k段以外的记录,请加载相应的k段。 你可以按照旧的方式做,也可以使用.Net的花式序列化的东西
像其他人指出的那样,使用诸如XML或简单分隔文件这样的文件将是更好的方法。 但是,我也可以建议另一个改进来改善内存的使用。
就像这样(尽管实际的加载应该使用外部文件来完成): –
public struct City { public string name; public string country; public double lat; public double lon; } private static City[] cc = new City[10000]; static CityDists() { string[] countries = new string[500]; // Replace following with loading from a "countries" file. countries[0] = "Papua New Guinea"; countries[1] = "Greenland"; // Replace following with loading from a "cities" file. cc[2].name = "Lae"; cc[2].country = contries[0]; cc[2].lat = 123; cc[2].lon = 123; cc[3].name = "Rabaul"; cc[3].country = countries[0]; cc[3].lat = 123; cc[3].lon = 123; cc[4].name = "Angmagssalik"; cc[4].country = countries[1]; cc[4].lat = 123; cc[4].lon = 123; cc[5].name = "Angissoq"; cc[5].country= countries[1]; cc[5].lat = 123; cc[5].lon = 123; }
这稍微增加了结构的大小,但显着减少了重复的国名所使用的内存。
我听到你的失望 没有调试器运行你的代码,它应该工作正常。 我在3秒内加载了2个数组,每个超过100,000个元素。 调试器报告“内存不足”,根本不是这样。
哦,你是正确的效率。 从XML文件加载相同的信息在手机上超过30秒。
我不知道谁在回答你的问题,但他们真的应该坚持市场营销。