在我的程序中,我执行一些任务,由MyParameter
对象进行参数化(我调用doTask(MyParameter parameter)
来运行任务)。
从程序的开始到结束,我可以创建很多任务(至少几百万)但我想每次只运行 (如果任务已经完成)已执行,方法无效)
目前,我正在使用HashSet
来存储已经执行的任务的MyParameter
个对象,但是如果MyParameter
对象是100字节,并且我在我的程序中运行10M任务,至少在内存中是1GB ......)
如何优化它,尽可能少地使用内存?
非常感谢你们
答案 0 :(得分:1)
如果你需要知道的是,是否已经处理了特定MyParameter
,请放弃HashSet
并改为使用BitSet
。
基本上,如果你需要知道的是一个特定的MyParameter
是否完成,那么将整个MyParameter
存储在集合中是过度的 - 你只需要存储一个位,其中0
表示“未完成”,1
表示“已完成”。这正是BitSet
的设计目标。
MyParameter
值的哈希值可能是唯一的,否则您当前使用HashSet
的方法毫无意义。如果是这样,那么您可以使用每个hashCode()
的{{1}}作为位集的索引,使用相应的位作为指示是否完成给定的MyParameter
。< / p>
这可能没有多大意义,所以以下是一个基本的实现。 (随意替换MyParameter
循环,for
,numParameters
等,以及您实际用于生成getParameter()
的任何内容
MyParameter
这种方法的内存使用情况有点取决于BitSet doneSet = new BitSet();
for (int i = 0; < numParameters; ++i) {
MyParameter parameter = getParameter(i);
if (!doneSet.get(parameter.hashCode())) {
doTask(parameter );
doneSet.set(parameter.hashCode());
}
}
在内部的实现方式,但我希望它比仅将BitSet
存储在MyParameters
中要好得多
事实上,如果您确实需要在处理它们之后挂起HashSet
对象,因为它们包含处理结果,那么您可以通过仅存储{的结果部分来节省空间MyParameter
MyParameter
中HashSet
(如果有可能的话 - 你的问题不清楚这一点。)
另一方面,如果你在完成处理后确实需要每个MyParameter
,那么你已经做了最好的事情。通过将它们存储为MyParameters
的向量(即可扩展数组)(这可以避免使用HashSet
中固有的一些内存开销),您可以在内存方面做得更好一点。由于扩展矢量所需的时间和O(n)搜索时间,将导致速度损失。
答案 1 :(得分:0)