程序中的独特任务

时间:2013-04-30 23:01:55

标签: java algorithm optimization set

在我的程序中,我执行一些任务,由MyParameter对象进行参数化(我调用doTask(MyParameter parameter)来运行任务)。

从程序的开始到结束,我可以创建很多任务(至少几百万)但我想每次只运行 (如果任务已经完成)已执行,方法无效)

目前,我正在使用HashSet来存储已经执行的任务的MyParameter个对象,但是如果MyParameter对象是100字节,并且我在我的程序中运行10M任务,至少在内存中是1GB ......)

如何优化它,尽可能少地使用内存?

非常感谢你们

2 个答案:

答案 0 :(得分:1)

如果你需要知道的是,是否已经处理了特定MyParameter,请放弃HashSet并改为使用BitSet

基本上,如果你需要知道的是一个特定的MyParameter是否完成,那么将整个MyParameter存储在集合中是过度的 - 你只需要存储一个位,其中0表示“未完成”,1表示“已完成”。这正是BitSet的设计目标。

MyParameter值的哈希值可能是唯一的,否则您当前使用HashSet的方法毫无意义。如果是这样,那么您可以使用每个hashCode()的{​​{1}}作为位集的索引,使用相应的位作为指示是否完成给定的MyParameter。< / p>

这可能没有多大意义,所以以下是一个基本的实现。 (随意替换MyParameter循环,fornumParameters等,以及您实际用于生成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 MyParameterHashSet(如果有可能的话 - 你的问题不清楚这一点。)

另一方面,如果你在完成处理后确实需要每个MyParameter,那么你已经做了最好的事情。通过将它们存储为MyParameters的向量(即可扩展数组)(这可以避免使用HashSet中固有的一些内存开销),您可以在内存方面做得更好一点。由于扩展矢量所需的时间和O(n)搜索时间,将导致速度损失。

答案 1 :(得分:0)

TreeSet会比HashSet提供更好的内存性能,代价是log(n)查找。

您可以使用No {s}键值存储,例如CassandraLevelDB,它们实际上是外部哈希表。

您可以压缩MyParameter表示,但如果它目前仅为100字节,那么我不知道您能够获得多少。