我正在一个大型数据集上运行一些实验,并希望优化特定的部分。目前,我有5-6个Models,每个都存储从Topics到List of Strings的映射。Topics的集合很大,并且每个Model之间都是相同的,所以肯定有更好的方法。最终,我需要执行的查询是:对于某个Model-Topic组合,List位置x的String是什么。
使用映射方法的一个问题是,如果有500k-5M个主题,每个主题都有一个20个字符串的列表。然后我的Map<Model, Map<Topic, List<String>>>就会变得很大。
发布于 2012-10-20 05:37:51
你有没有尝试过SortedSet /地图?听起来你需要优化你的搜索,排序的集合(如TreeMap)应该是log(n),而常规列表是O(1)。当然,这类事情是数据库擅长的……
发布于 2012-10-20 05:50:37
您可以使用Topic和Model在单个映射中构造组合键,例如
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的情况。
发布于 2012-10-20 05:58:04
不清楚你想在哪里/如何实现“内存效率”。首先,您需要查看详细数据的细节,以了解这些数据消耗了多少存储空间,然后检查组织这些数据的各种方法,并根据开销百分比与您的“真实”数据来分析它们的效率。
粗略地看一下,当您考虑关联表时,HashMap的每个条目大约有80字节的开销。ArrayList看起来平均在10-12左右。不用看,我猜TreeMap应该比HashMap更多--也许是100。
一般来说,与使用这些聚合对象的链接相比,您自己的对象中的链接在存储和访问速度方面都将“更便宜”。但是聚合对象使用起来很方便,并且已经在一定程度上进行了“优化”。
(但是在查看更新时,您可能应该查看DB应用程序,而不是将所有内容都放在堆中。)
https://stackoverflow.com/questions/12982745
复制相似问题