在java中处理大型数据列表

在java中处理大型数据列表,java,memory,Java,Memory,我正在开发一个评级系统,在进行评级之前,该系统会将数百万个关税计划加载到内存中, 关税计划列表每天都在增长(有时每天超过20k条记录),从过去几周开始,我们面临着内存问题。 由于某些业务规则,基于日期标准加载一定数量的关税也是不可行的 是否有一种方法可以实现某种缓存机制(分批分摊费用并根据需要加载/卸载)? 还是要内存映射价目表 我们正在使用hibernate进行数据库获取。在java中加载和卸载数百万个对象对于内存来说总是太重,在java中这不是最好的做法。我也同意dystroy的观点,hib

我正在开发一个评级系统,在进行评级之前,该系统会将数百万个关税计划加载到内存中, 关税计划列表每天都在增长(有时每天超过20k条记录),从过去几周开始,我们面临着内存问题。 由于某些业务规则,基于日期标准加载一定数量的关税也是不可行的

是否有一种方法可以实现某种缓存机制(分批分摊费用并根据需要加载/卸载)? 还是要内存映射价目表


我们正在使用hibernate进行数据库获取。

在java中加载和卸载数百万个对象对于内存来说总是太重,在java中这不是最好的做法。我也同意dystroy的观点,hibernate不是最好的选择


事实上,您需要开始考虑将逻辑移到java之外,无论是存储过程还是一些本机实现。

我想您的问题实际上是一个算法问题,而不是内存问题。尝试在树中构建数据结构,只加载在特定时刻跨越的数据分支。完成后,卸载该分支的数据并加载新分支。这是我的看法,但可能有更好的算法。这肯定会更慢。

在处理此类数字时,您必须非常精确地定义与问题相关的策略,因此我们无法回答,因为我们不知道内存中真正需要什么以及读/写操作

几乎可以肯定,当您必须精确地管理加载和卸载时,使用hibernate之类的工具是个坏主意

你应该:

  • 定义评级要求(可能已经完成)
  • 检查不能以常规方式进行(有许多评级系统和已知策略)
  • 要求(例如)对你的评分有一个想法
  • 只有这样,我们才能确定您是否应该使用RandomAccessFile和nio通道,或者使用jdbc和智能加载,或者只使用一些查询
请注意,评级通常是一个很难解决的理论问题。例如,见


作为一个更直接的回答,我想说我使用RandomAccessFile和对许多同时打开的4 Go文件进行快速读写。

在处理此类数字时,您必须非常精确地定义与问题相关的策略,因此我们无法回答,因为我们不知道内存中真正需要什么以及读/写操作。几乎可以肯定,当您必须精确地管理加载和卸载时,使用hibernate之类的工具是个坏主意。您可以使用JavaNIO和直接磁盘映射到内存、随机访问文件和通道,但再一次很难说是先验的。