1

我正在开发一个应用程序,其中我有一个包含5000行和4列的数据库。

problem_id (int)
problem_no (string)
problem_title (string)
dacu (int)

我需要经常查询大范围的单个项目,比如1000 query to fetch problem_no based on problem_idor sometimes only one item

所以我决定hashMap在运行时查询所有数据库行并将它们映射到 a 中。我知道 hashmap 插入/查询操作只O(1)需要或有时需要更多,所以我认为只需要 5000 次操作。但是在这种情况下 hashMap 会占用多少空间呢?androiddalvik能够毫无困难地分配它们吗?

4

2 回答 2

2

hashmap 会占用多少空间?

这是一个实现细节,可能因版本、设备等而异。只要我们理解这一点并仅寻找估计,您实际上可以非常轻松地测量它。Android SDK 包含一套功能强大的内存分析工具。查看 Eclipse MAT(我眼中最好的)。您可以在哈希图完全加载时拍摄堆快照,然后使用 MAT 查看它需要多少字节。确保你总结了哈希本身、键和值(如果我没记错的话,MAT 也可以为你做数学(它可以很好地处理核心集合)。

dalvik能分配吗?

为了便于讨论,假设您的 hashmap 占用 1MB 内存。要了解这是否太多,我们需要了解我们所居住的系统的约束。Dalvik 限制了堆的最大大小。限制因设备而异。非常旧的设备上的最小值是 16MB。三星 Galaxy 2 等设备的容量约为 32MB-48MB,而 Galaxy 3 和 4 等新设备的容量则超过 100MB。

应用程序中最大的内存消耗通常是位图。由于每个像素可能占用多达 4 个字节,因此全屏位图可以轻松占用几 MB 内存。

考虑到这一点,1MB 的收费听起来还不错。这相当于使用漂亮的背景图像 :) 如果您的整体内存使用率很低,您可以按照您认为合适的方式分发它。内存分析工具(MAT 或 DDMS)可让您准确了解应用程序当前使用的内存量,因此您可以轻松估算总消耗量。

其他想法:

  • 将事物缓存在内存中以提高性能通常是一个好主意。所以你的方法在我看来是一个很好的方法(只要你理解记忆的含义)。

  • 由于您的内存哈希图只是一种优化,因此您可以格外小心,并且仅在有可用内存时才这样做。您可以轻松测量可用堆的数量(即 API)并做出相应的决定。您可以收听内存不足的通知事件(谷歌关于那些)。您甚至可以捕获分配失败的 OutOfMemoryError 异常并在运行时更改内存策略。

  • 您正在一个难以精确测量的领域中玩耍。请务必在多个设备和多个 Android 版本上进行质量检查。要模拟低内存设置,请尝试使用您能找到的最旧的设备。

于 2013-08-07T05:45:04.153 回答
1

我个人认为,处理内存中想要的内容绝对没有问题。特别是如果这些东西只是基元(没有位图)。

我已经使用了多达 10k 行的查询来缓存在内存中,并且在内存方面绝对没有问题。

当您需要处理所有内容时,可能会发生此问题。就像到达特定项目的速度有多快,获取所有相关项目等。

我遇到的一个问题是 UI 相关的。我试图只填充一个适配器并将其显示在一个包含所有 10k 行的列表中,这需要大约 7 秒才能完成。那是很久以前的事了,我不记得为什么会发生这种情况,但我要说的是,我会更加注意保持在 UI 线程之外的处理,并尽可能多地管理它,而不是你的情况下的内存。

于 2013-08-07T06:02:06.767 回答