用Java过滤/排序大量数据

时间:2012-12-20 11:39:43

标签: java sorting filtering in-memory-database

首先让我简要介绍一下这个场景。该数据库是Sybase。有2-3 k存储过程。存储过程可能会返回大量数据(大约百万条记录)。将有一个服务(servlet / spring控制器),它将调用所需的过程并以xml格式将数据刷回客户端。

我需要应用过滤(在多列和多重条件下)/排序(基于某些动态标准),我已经完成了。

问题是,由于数据量巨大,在内存中进行所有过滤/排序并不好。我想到了以下选项。

选项1: 获得ResultSet对象后,请阅读一些X no。记录,过滤它,将其存储在某个文件中,重复此过程直到读取所有数据。然后只需读取文件并将数据刷新到客户端。

我需要弄清楚如何对文件中的数据进行排序以及如何在文件中存储对象,以便过滤/排序快速。

选项2: 寻找一些Java API,它接收数据,过滤它和它。根据给定的标准对其进行排序,并将其作为流返回

选项3: 使用内存数据库,如hsqldb,h2database,但我认为这将开销而不是帮助。我需要先插入数据,然后查询数据,这也将依次使用文件系统。

注意我不想修改存储过程,因此在数据库中进行过滤/排序的选项不是一个选项,或者如果没有其他工作可能是最后一个选项。

如果它有帮助,我从ResultSet读取的每条记录,我将它存储在Map中,其中键是列名,这个Map存储在List中,我在其中应用过滤&排序

您认为哪个选项对内存占用,可扩展,性能方面或任何其他适用于此场景的选项都有好处?

由于

2 个答案:

答案 0 :(得分:2)

我建议使用选项3 ,但它不需要是内存数据库;你可以使用适当的数据库。任何其他选项只是解决大量数据排序的一般问题的更具体的解决方案。也就是说,毕竟,确切地说是数据库的用途,并且它做得非常好。

如果您确实认为自己的选项3不是一个好的解决方案,那么您可以实施排序/合并解决方案。像你已经做的那样收集你的Map但是当你达到记录限制(比如说10,000个)时,将它们排序,将它们写入磁盘并从内存中清除它们。

数据完成后,您现在可以打开您编写的所有文件并对其进行合并。

答案 1 :(得分:1)

hadoop适用于您的问题吗?

您应该过滤数据库本身的数据。您可以编写聚合过程,该过程将执行所有其他过程,组合数据或过滤它们但是最好的选择是修改2-3,000个存储过程,以便它们只返回所需的数据。