0

我正在实现一个程序,它有大约 2,000,000(200 万)个数组,每个数组大小为 16,512(128 x 129)的整数。我一次只需要调用 200 个数组(即 3.3 MB),但我想知道我是否可以将程序扩展为超过 200 万个(比如 2 亿个),但我仍然只需要一次调用 200 个数组。那么在我一次不使用超过 200 个数组的情况下,制作越来越多的数组的限制是什么?

4

3 回答 3

3

我非常怀疑这一点,除非您在具有大量 RAM 和非常大的堆的 64 位机器上运行。

让我们计算一下数据所需的内存:

2,000,000*128*129*8/1024/1024/1024 = 30.8GB.

JVM、程序的其余部分和操作系统需要额外的 RAM。

对我来说,这听起来像是一个构思不佳的解决方案。

如果您的意思是“我一次只有 200 个数组在内存中”,您当然可以这样做,但是您必须将其余的移到辅助存储或关系数据库中。查询它们,使用它们,GC 它们。这可能不是最好的解决方案,但根据您发布的内容很难判断。

更新:

“触发器”是否意味着“数据库触发器”?

是的,您可以将它们存储在磁盘上。我不能保证它会执行。你的硬盘当然可以处理 30GB 的数据;如果足够大,它可以容纳 300GB。

请记住,您必须考虑如何管理 RAM。GC 抖动可能是一个问题。一个好的缓存解决方案可能是你的朋友。自己不要写。

如果该硬盘驱动器发生故障并且您丢失了所有数据会怎样?你备份吗?如果磁盘出现故障,您的应用程序能否承受停机?想想那些场景,也是。祝你好运。

于 2012-05-01T19:20:14.007 回答
0

只要您不保留对不再需要的数组的引用,就没有硬性限制。旧数组会自动被垃圾回收,所以你可以无限地分配和放弃数组。

当然,在任何给定时间可以保留的数组数量是有限制的。这受 JVM 可用内存量的限制。

于 2012-05-01T19:20:17.460 回答
0

只要您增加最大堆大小以确保您的应用程序不会耗尽内存,就可以了。

于 2012-05-01T19:20:30.570 回答