首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找内存高效的设计

寻找内存高效的设计
EN

Stack Overflow用户
提问于 2012-10-20 05:32:07
回答 5查看 131关注 0票数 3

我正在一个大型数据集上运行一些实验,并希望优化特定的部分。目前,我有5-6个Models,每个都存储从Topics到List of Strings的映射。Topics的集合很大,并且每个Model之间都是相同的,所以肯定有更好的方法。最终,我需要执行的查询是:对于某个Model-Topic组合,List位置x的String是什么。

使用映射方法的一个问题是,如果有500k-5M个主题,每个主题都有一个20个字符串的列表。然后我的Map<Model, Map<Topic, List<String>>>就会变得很大。

EN

回答 5

Stack Overflow用户

发布于 2012-10-20 05:37:51

你有没有尝试过SortedSet /地图?听起来你需要优化你的搜索,排序的集合(如TreeMap)应该是log(n),而常规列表是O(1)。当然,这类事情是数据库擅长的……

票数 1
EN

Stack Overflow用户

发布于 2012-10-20 05:50:37

您可以使用TopicModel在单个映射中构造组合键,例如

代码语言:javascript
复制
map.put(topic1_id + model1_id, list1_1);
map.put(topic1_id + model2_id, list1_2);
...
map.get(topic_id + model_id)

其中ID是字符串(或者类似的方案可以与数字标识符一起使用)。

一种类似的方法是为每个主题分配一个唯一的数字,然后将字符串列表存储在数组中,因此查找给定组合的列表就是查找两个索引,然后访问2D数组中的给定位置。(但是,当您在构建数据结构之前知道主题和模型的数量时,这会更容易)

为了提高内存效率,还要考虑小细节。通常,您希望最小化对象的数量-每个对象都有开销。当ArrayLists动态增长时,它们可能会有大量浪费的空间,当它们超出当前容量时,其大小会加倍。如果您可以将它们预先调整到所需的容量(或者使用数组),那么您就可以节省大量内存。这同样适用于使用大量小HashMaps的情况。

票数 1
EN

Stack Overflow用户

发布于 2012-10-20 05:58:04

不清楚你想在哪里/如何实现“内存效率”。首先,您需要查看详细数据的细节,以了解这些数据消耗了多少存储空间,然后检查组织这些数据的各种方法,并根据开销百分比与您的“真实”数据来分析它们的效率。

粗略地看一下,当您考虑关联表时,HashMap的每个条目大约有80字节的开销。ArrayList看起来平均在10-12左右。不用看,我猜TreeMap应该比HashMap更多--也许是100。

一般来说,与使用这些聚合对象的链接相比,您自己的对象中的链接在存储和访问速度方面都将“更便宜”。但是聚合对象使用起来很方便,并且已经在一定程度上进行了“优化”。

(但是在查看更新时,您可能应该查看DB应用程序,而不是将所有内容都放在堆中。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12982745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档