内存高效且快速的iPhone / Android字典存储/访问

时间:2011-09-12 12:05:26

标签: iphone string memory dictionary mono

我在老一代iPhone(ipod touch 1st gen,2nd gen e.t.c)上遇到内存问题。这是由于我加载和存储170k字词时分配的内存量。

这是代码(非常简单):

string[] words = dictionaryRef.text.Split("\n"[0]);
_words = new List<string>(words);

这开始分配大约12mb的存储空间,我认为iphone大约有43mb。所以+纹理+声音+它往往会破坏的操作系统。

速度方面,使用二进制搜索进行访问很好。但它更有效地将其存储在内存中(并更有效地加载它)。

text.Split似乎占用了很多堆内存。

有什么建议吗?

4 个答案:

答案 0 :(得分:0)

这些3.0之前的设备在启动时可用的内存数量太多了。 43 MB相当乐观。您的应用只是检查该单词是否在列表中?您可能希望滚动自己的哈希表而不是使用二进制搜索。我会搜索一些文献和堆栈溢出,以寻找有效的方法来存储具有特定字大小的大字典。谷歌搜索哈希表可能会为您提供更好的实施。

答案 1 :(得分:0)

使用SQLite。它将使用更少的内存并且更快。在你的单词列上创建一个索引,瞧,你有二进制搜索,没有在内存中加载整个字典。

答案 2 :(得分:0)

首先,如果 dictionaryRef.text 是一个字符串(并且看起来如此),那么你已经获得了巨大的分配(每个字符2个字节)。检查一下,它可能会占到分配的总内存量的大(接近一半)。你应该考虑缓存这个(数据库的想法很好,但是文件可以在将来的执行中使用File.ReadAllLines)。

接下来你可以尝试比Mono的Split方法做得更好。它创建一个List,然后在最后将它转换为一个数组(调用ToList) - 最后你将创建一个新的List。由于您的要求(仅'/ n')非常基本,我建议您滚动自己的Split方法(或复制/粘贴/减少Mono中的方法)并避免临时内存分配。

在任何情况下都要进行大量(内存)测量,因为分配,甚至更多的字符串,经常发生在我们不看的地方; - )

答案 3 :(得分:0)

我必须同意晨星的观点,即使用SQLite后端进行文字存储听起来像是你想要做的最好的解决方案。

但是,如果你坚持使用单词列表,这里有一个建议:

在我看来,通过读取整个文本文件(File.ReadAllText()或其他一些文件)构建了dictionaryRef.text。

为什么不使用TextReader.ReadLine()从文件中一次读取1个单词到List,从而避免使用String.Split()并使用大量的临时存储空间? / p>

最终,这似乎是你想要的......而且ReadLine()会为你“分裂”\ n。