使用缓存对对象的ArrayList进行排序



如对以下问题有任何建议,我们将不胜感激。

现状:我有一个对象的ArrayList。我们已经使用比较器实现了排序。该对象有数百个字段。因此,ArrayList中单个对象的大小并不小。展望未来,当ArrayList的大小增加时,我们觉得这将在排序中产生问题,因为ArrayList总体大小。

计划:我们将在Cache中加载对象。我们计划将id(字符串(的ArrayList作为输入,而不是将对象的ArrayList作为输入。当比较id时,我们计划从缓存中获取对象。

问题:我不想加载缓存中的所有对象,因为这个缓存只会在排序过程中使用。所以我不想仅仅为此创建一个巨大的缓存。

我计划做的是只加载缓存中一半的对象,如果缓存中没有任何东西,则从DB加载它,读取它并将其放入缓存(这将替换缓存中的一个对象(。我不想在数据库中查询单个对象,因为这样我会打数据库成千上万次。

我想从数据库中进行批量读取,但我没能制定策略。

任何建议都将不胜感激。

你很困惑。

对象有数百个字段。

无关。Java使用引用;您拥有的"对象的arraylist"由一个数组支持,该数组中的每个插槽大约占用8个字节(取决于底层VM的详细信息,也可能是4个字节(。它们或多或少地代表了对象在内存中的位置。

当ArrayList的大小增加时继续

。。。。不,不会的。如果在这个列表中放入100000个条目,那么至少对于列表本身来说,总内存负载最多为800000字节,不到1兆字节。这样说吧:在现代硬件上,仅此列表就可以包含1亿个项目,而且你的系统不会流汗(这将不到参考文件的GB内存(。现在,如果你也有1亿个唯一的对象(比如说,添加1亿次完全相同的对象,或者添加1亿次空对象(,那么这个对象也会占用内存。这可能是个问题。但这份清单并不是相关的部分。

由于ArrayList的整体大小,我们觉得这会在排序中产生问题。

否。当你对数组列表进行排序时,你会得到~nlogn操作来对它进行排序。实际的排序基础结构部分(在列表中移动对象(几乎是零成本的(它只是在一个内存页上快速传输4到8字节的序列。假设调用.compare((很便宜,即使是一台100美元的一次性计算机也可以在几秒钟内对数百万个条目进行排序。这只留下了.compare((的~nlogn调用。如果这很昂贵,好吧,你可能有问题。因此,在一个包含100万个条目的列表中,您将看到大约1300万个compare方法的调用。

它有多快?

如果调用.compare(a,b((其中a和b是指向"数百个字段"对象实例的指针(检查这数百个字段中的每一个字段,这可能会有点棘手,但如果它只检查其中的几个字段,这里就不用担心了。CPU是FAST。你可以去:;数百万?天哪&";,但你的CPU却嘲笑这份工作。

我们将在Cache中加载对象。

由于上述原因,此计划不好。

我想从DB 进行批量读取

好吧,当你一开始说"我们有一个对象的数组列表"时,实际上你没有,而且你有一个DB连接?是哪一个?

要么你把所有的数据都放在数组列表中,要么你把数据放在数据库中。如果它都在一个数组列表中,那么DB部分就无关紧要了。如果你没有把所有的数据都放在数组列表中,你的问题就会产生误导,而且不清楚。

如果数据在数据库中,请设置适当的索引并使用ORDERBY子句。

最新更新