2012-06-07 31 views
1

我正在制定一个评估系统,该系统在进行评级前将数百万关税计划加载到内存中, 关税计划列表每天保持增长(有时每天超过20k条记录)和上次我们几个星期都面临记忆力问题。根据日期标准加载一定数量的关税也是不可行的,这是由于一些业务规则。在java中处理大型数据列表

有没有办法实现某种缓存机制(分批分批收费和根据需要加载/卸载)? 或内存映射关税清单?

我们使用hibernate进行数据库读取。

+0

当处理这些数字时,您必须定义一个与问题非常精确相关的策略,所以我们无法回答,因为我们不知道内存和读写操作真正需要什么。几乎可以肯定的是,当你必须精确地管理加载和卸载时,使用像hibernate这样的东西是一个坏主意。您可以使用Java nio和直接磁盘映射到内存,RandomAccessFile和Channels,但是再一次很难说先验。 –

回答

0

在java中加载和卸载数百万个对象对于内存来说总是过于沉重,并且不是java中最好的事情。我也同意,在这里冬眠不是最好的选择。事实上,你需要开始思考移动java之外的逻辑,无论是在存储过程还是本地实现。

0

我想你的问题真的是算法问题,而不是内存问题。尝试在树中构造数据并仅加载在特定时刻穿越的数据分支。当你完成你卸载该分支的数据并加载新的。这是我的看法,但可能会有更好的算法。这肯定会变慢。

0

在处理这些数字时,必须定义一个与问题非常精确相关的策略,所以我们无法回答,因为我们不知道内存和读/写操作真正需要什么。

几乎可以肯定的是,当你必须精确地管理加载和卸载时,使用类似hibernate的东西是一个坏主意。

你应该:

  • 定义等级要求(可能已经完成)
  • 检查它不能在通常的方式完成(有无数的评级系统和已知的策略)
  • 要求(例如在https://softwareengineering.stackexchange.com/
  • 只有那么我们可以说,如果你应该使用RandomAccessFile和nio通道,或者jdbc和智能加载,或者只是几个查询

小心评级通常是一个难解决的问题。例如,请参阅this interesting article

作为更直接的答案,我会说我使用RandomAccessFile和FileChannel在许多同时打开的4 Go文件上进行了非常快速的读写。