如何在不使用太多内存的情况下在Java中处理大型数据集

Tyl*_*ler 5 java

我在Java工作.我要求我必须主要比较两个数据库查询.为此,我获取结果集的每一行并将其分配给HashTable,其字段名称为"key",字段中的数据为"value".然后,我将整个HashTables结果集分组为一个Vector,就像容器一样.所以基本上比较两个查询,我实际上正在迭代两个HashTables的向量.

我发现这种方法对我来说非常好,但需要大量的内存.由于其他设计要求,我必须通过类似Vector-HashTable的结构进行此比较,而不是某些DB端过程.

有没有人有任何优化建议?最佳解决方案将与我现在所做的有些类似,因为大多数代码都是围绕它设计的.

谢谢

eri*_*son 6

ORDER BY为两个结果集指定相同的子句(基于"键").然后,您只需要在内存中同时拥有每个结果集中的一条记录.

例如,假设你的结果是res1res2.

如果key字段res1小于key字段res2,res2则缺少一些记录; 迭代res1直到其key字段等于或大于更大keyres2.

同样,如果key字段res1大于key字段res2,res1则缺少一些记录; 迭代res2来代替.

如果key当前记录的字段相等,则可以比较它们的值,然后迭代两个结果集.

通过这种方式,您可以看到每个结果中只需要一个记录在给定时间内保存在内存中.


Noe*_*l M 3

你看过蝇量模式吗?你有很多相同的物体吗?

也许这种模式可能适合您的“键”,因为我想象每行都会重复字段名称?如果它们是字符串,您可以调用intern(),以便它们与其他相等的字符串共享相同的内存位置,因为字符串是不可变的。

另一种可能的优化 - 不是内存而是速度 - 如果并发不是问题,则使用 anArrayList而不是 a Vector- 因为它们不同步,因此访问应该更快一点。同样,HashMap不同步和Hashtable同步,因此使用前者可能也会更快。