【问题标题】:Memory Efficient and Speedy iPhone/Android Dictionary Storage/Access内存高效和快速的 iPhone/Android 字典存储/访问
【发布时间】:2011-09-12 12:05:26
【问题描述】:

我在老一代 iPhone(ipod touch 第 1 代、第 2 代等)上遇到内存问题。这是由于我在加载和存储 170k 单词词典时分配的内存量。

这是代码(很简单):

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

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

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

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

有什么建议吗?

【问题讨论】:

  • "\n"[0] 是什么?你不能只用'\n'吗?
  • 现在真正的问题:为什么需要 List 而不是普通数组?
  • 我估计 170,000 个单词(可能被高估了)平均 10 个字符(每个字符一个字节)应该只占用大约 1.7MB。将数据存储为 char 数组的数组应该只占用这么多内存。
  • "\n"[0] 是它需要一个列表的要求。 - 我使用二进制搜索列表。大部分内存用于将列表拆分为单词。有没有办法优化它?

标签: iphone string memory dictionary mono


【解决方案1】:

对于这些 3.0 之前的设备在启动时有多少可用内存,您不能指望太多。 43 MB 相当乐观。您的应用程序是否只是检查单词是否在列表中?您可能想要滚动自己的哈希表而不是使用二进制搜索。我会搜索一些文献和堆栈溢出,以寻找有效的方法来存储具有特定字长的大型字典。谷歌搜索哈希表可能会给你一个更好的实现。

【讨论】:

  • 它不是存储列表的内存,而是将其拆分为单词时使用的内存。否则搜索速度很快。哈希表总体上只会使用更多内存。我需要一种更好的方法来根据分隔符(新行)将字符串拆分为单词。
  • 您的二叉树正在耗尽内存,因为它必须将所有树都保存在内存中。如果使用哈希表,一旦将单词放入表中,就不必保留所有节点来进行二分搜索,并且在某些情况下,哈希搜索应该几乎同样有效,甚至更高。关键是要选择适合您提议的数据的良好哈希算法。
【解决方案2】:

使用 SQLite。它将使用更少的内存并且速度更快。在你的 words 列上创建一个索引,瞧,你有二进制搜索,而无需将整个字典加载到内存中。

【讨论】:

    【解决方案3】:

    首先,如果 dictionaryRef.text 是一个字符串(看起来确实如此),那么您已经分配了一些巨大的东西(每个字符 2 个字节)。检查这一点,它很可能占分配的总内存的大部分(近一半)。您应该考虑缓存它(数据库的想法是一个很好的想法,但是文件可以在以后的执行中使用 File.ReadAllLines)。

    接下来你可以尝试比 Mono 的 Split 方法做得更好。它创建一个列表,然后在最后将其转换为一个数组(调用 ToList) - 您最终会从中创建一个新列表。由于您的要求(仅“/n”)是相当基本的,我建议您推出自己的拆分方法(或从 Mono 复制/粘贴/减少该方法)并避免临时内存分配。

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

    【讨论】:

      【解决方案4】:

      我不得不同意 Morningstar 的观点,即使用 SQLite 后端存储单词听起来是您尝试做的最好的解决方案。

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

      在我看来,dictionaryRef.text 是通过完整读取文本文件(File.ReadAllText() 或类似文件)构建的。

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

      最终这似乎是你想要的......并且 ReadLine() 将在 \n 上为你“分裂”。

      【讨论】:

        猜你喜欢
        • 2011-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 2018-07-23
        • 1970-01-01
        相关资源
        最近更新 更多