我正在开发一个应用程序,其中我有一个 5000 行, 4 列的数据库。
problem_id (int)
problem_no (string)
problem_title (string)
dacu (int)
我需要经常查询大型的单个项目,例如1000 query to fetch problem_no based on problem_id
或sometimes only one item
。
所以我决定查询所有数据库行并在运行时将它们映射到hashMap
。我知道hashmap插入/查询操作只需要O(1)
或者有时甚至更多,所以我认为我只需要5000次操作。但是在这种情况下hashMap会占用多少空间? android dalvik
能够毫无困难地分配它们吗?
答案 0 :(得分:2)
hashmap需要多少空间?
这是一个实现细节,可以在版本,设备等之间变化。只要我们理解并仅查找估算,您就可以非常轻松地进行测量。 Android SDK包含一套功能强大的内存分析工具。看看Eclipse MAT(我眼中最好的)。您可以在完全加载hashmap时获取堆快照,然后使用MAT查看它需要多少字节。确保你总结散列本身,键和值(如果我没记错的话MAT也可以为你做数学计算(它可以很好地处理核心集合)。
dalvik会分配吗?
为了便于讨论,我们假设你的hashmap需要1MB的内存。为了感受到这一点,我们需要了解我们所处系统的约束.Dalvik限制了堆的最大大小。限制因设备而异。非常旧的设备上的最小值是16MB。像三星Galaxy 2这样的设备大约有32MB-48MB,像Galaxy 3和4这样的新设备有超过100MB。
应用程序中最大的内存耗费通常是位图。由于每个像素可能需要多达4个字节,因此全屏位图很容易占用几MB内存。
考虑到这一点,1MB的收费听起来并不坏。它与使用漂亮的背景图像相当:)如果你的整体内存使用率很低,你可以按照你认为合适的方式分发它。内存分析工具(MAT或DDMS)可以让您准确了解您的应用当前使用的内存量,因此您可以轻松估算您的总消费量。
其他想法:
在内存中缓存内容以提高性能通常是个好主意。所以你的方法在我眼中是一个很好的方法(只要你理解了记忆的含义)。
由于您的内存hashmap只是一种优化,因此您可以格外小心,只有在有内存备用时才能这样做。您可以轻松地测量可用堆的数量(该API的API)并做出相应的决策。您可以收听内存不足通知事件(google关于这些事件)。您甚至可以捕获失败分配的OutOfMemoryError异常,并在运行时更改内存策略。
您正在一个难以准确测量的领域进行游戏。请务必在多个设备和多个Android版本上进行质量检查。要模拟低内存设置,请尝试使用您可以找到的最旧的设备。
答案 1 :(得分:1)
我个人认为你在内存中处理你想要的东西绝对没有问题。特别是如果那些东西只是原始的(没有位图)。
我在内存中使用了多达10k行的查询进行缓存,并且在内存方面完全没有问题。
当您需要处理所有内容时,可能会发生此问题。就像获得特定物品的速度有多快,获得所有相关物品等等。
我遇到的一个问题是UI相关。我试着填充一个适配器并将其显示在一个包含所有10k行的列表中,大约需要7秒才能完成。这是很久以前我不记得为什么会发生这种情况,但我所说的是我会更加注意在UI线程之外继续处理并尽可能地管理它而不是你的情况下的内存。