【问题标题】:Array of size 10^8 as input in Java [duplicate]大小为 10^8 的数组作为 Java 中的输入 [重复]
【发布时间】:2021-01-21 00:48:51
【问题描述】:

如何将一个大小arr[i]<=10^8.

下面的代码给出了运行时错误和 java.lang.OutOfMemoryError。 我已经多次收到这个问题但从未得到答案,因为它给出了较大的 n 和 arr[i] 值的错误。 我知道它不能以下面给出的方式完成。那么问题来了,如何用 Java 实现呢?

n=100000000;//User input
int[] arr=new int[n];
int[] b=new int[n];
for(int i=0;i<n;i++)
{
    b[i]=arr[i]+1;
}

【问题讨论】:

  • 2 个这样大小的数组大约有 800MB 的 RAM,您必须有足够大的连续内存区域才能成功分配。您使用的是 32 位操作系统吗?但真正的问题是什么?你在做一些比赛吗?你需要读取这样一个巨大的数组是非常罕见的
  • 糟糕,实际上是heap size 可能会受到限制;无论如何,两者之一应该会给你答案。
  • 我在多个比赛中都得到了这个问题,只是不知道对这种大小的数组进行操作的正确方法。
  • 不,您不能对这种大小的数组进行操作。您需要更改算法,通常它最多只需要一个 O(n.logn) 空间,尽管很可能是 O(1) 或 O(n),并且比 brute 快得多像这样强迫

标签: java arrays


【解决方案1】:

首先,调查是否真的有必要将整个数组保存在内存中。在许多情况下,您只需一次处理一个元素即可执行所需的操作。

如果确实需要存储数组,则在示例中分配两个 int 数组,每个数组有 1e8 个元素。他们大约需要 800MB 的内存。这在现代硬件上并非遥不可及。只需确保以足够的堆空间启动 JVM。请参阅 -Xmx-Xms 选项。

【讨论】:

  • 我的错,时间不长。是的。
【解决方案2】:

这里的限制总是受到可用物理内存的限制。 Java 原始类型 int 需要 32 位(4 个字节),1 亿个 int 大约需要 400MB 内存。

每个 Java 版本的默认 JVM 最大堆大小不同。我们以Java 8为例,根据Oracle Java 8 documentation

最大堆大小

小于物理内存的 1/4 或 1GB。在 Java SE 5.0 之前, 默认的最大堆大小为 64MB。您可以覆盖此默认值 使用 -Xmx 命令行选项。

因为您需要两个数组,所以您需要 800MB

您需要使用 -Xms800M 启动 java(这会将初始堆大小设置为 800MB)并将最大堆大小设置为适合您系统的大小,例如 1GB - Xms1G

【讨论】:

    【解决方案3】:

    您的内存分为 Xmx(年轻和旧)、永久、堆叠和杂项区域。您需要扩展 Xmx 内存来处理更大的对象。 example of dividing java memory

    【讨论】:

      猜你喜欢
      • 2021-07-15
      • 2020-06-26
      • 2011-09-05
      • 2021-11-30
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      相关资源
      最近更新 更多