如何在移动设备上管理大量数据

17

我正在实现一个日语词典,希望能够找到快速高效的条目查找方法。词典条目本身存储在一个类中,该类包含了用日语书写的单词(可能有多个拼写方式),它们的音标发音和英语定义,分别存储在三个列表中。

起初,我使用了一种树形结构,其中每个节点表示单词中的一个字符。这个方法非常快,但是占用了很多内存。数据本身约为35MB,而树形结构本身约为130MB。此外,它也只允许从日语 -> 英语进行查找。因为需要额外的索引,所以内存是一个问题,计划将应用程序移植到Windows Phone 7。该词典包含150,000个条目。

总之,我需要做到以下几点:

  • 存储定义列表
  • 为日语、音标和英文含义建立三个索引
  • 查询速度快(理想情况下小于1秒)
  • 尽可能少地使用内存(Windows Phone 7的内存使用限制为90MB)

有什么好的想法吗?

2个回答

6
你需要考虑使用移动数据库或网络服务来处理移动设备上的大量数据。无论在任何平台上,您都很难正确获取所需的性能、功能和管理,但您不必这样做。使用带有适当索引和表格的数据库,可以是本地的或远程的。
SQL CE 对于 WP7 不可用,但有其他选项(商业和开源)(链接1)。此外,如果您希望经常连接且可以接受一些延迟,请考虑使用 Web 服务。您可以在中央服务器上使用任何选择的数据库,并通过 Web 服务呈现给您。您的瓶颈将是通信,但您可以从受限设备卸载大量处理。

非常感谢您的评论。我怀疑对于我需要的功能,数据库或Web服务可能是最好的选择。我会查看WP7上提供的各种选项,看看它们提供了什么。 - Andrew
"SQL CE目前在WP7上不可用" => 但是它将成为WP7.5(Mango)的一部分。 - jv42

1
最简单的解决方案是:在客户端只接受输入,然后向服务器端发送请求,服务器端返回输出到客户端
另一种方法是将应用程序离线化:
  1. 日语单词列表应该按字典顺序排列,其他两个列表也如此。
  2. 由于日语有50个字母,因此可以根据单词的前两个字母将列表分成50 * 50份。所以关键点是:准备一个50 * 50数组,记录文件中第一二个字母的起始位置对应的偏移量。如果使用32位整数存储偏移量,则需要10KB。
  3. 对于每个日语单词,在其他两个列表中存储偏移量。为方便起见,可以将这两个列表组合在一起。如果使用32位整数存储偏移量,并且您有150000个条目,则会将数据大小增加600KB。
  4. 保持偏移量数组在内存中,当输入日语单词时,首先根据前两个字母找到偏移量,然后读取所有以前两个字母开头的日语单词。因为您有150000个条目,所以平均而言,以相同两个字母开头的单词数量为60。而一个内存页是4KB,足够容纳60个单词,因此只需要1个IO。在找到其他两个列表中的偏移量后,读取相应的内容。因此,在搜索操作中只需要2个IO。计算成本也很小,内存成本也非常低。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接