我正在尝试将大量的long存储到数组中,但是我的数组和ArrayList出现了OOM错误。
ArrayList<Long> A = new ArrayList<Long>();
Long[] B = new Long[100000000];
for(int i = 0; i < 100000000; i++) A.add(i);
for(int i = 0; i < 100000000; i++) B[i] = (long) i;
//Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
//at java.lang.Integer.valueOf(Unknown Source)
我是否可以使用其他简单的数据结构来存储如此大量的long或整数?
答案 0 :(得分:1)
如果您在运行-Xmx
时适当使用java
标记(有关详细信息,请参阅here),您可以增加堆大小。这将允许您在需要时以受控方式使用更多内存。据我所知,没有一种方式可以问&#34;从程序本身获取更多堆内存(类似于在C中运行sbrk()或mmap()系统调用)
我联系的答案是:
例如,像这样启动JVM将以256MB的速度启动它 内存,并允许进程使用多达2048MB的内存:
java -Xmx2048m -Xms256m
此外,您可以使用&#34; k&#34;,&#34; m&#34;或&#34; g&#34;分别为Kilobytes,Megabytes和Gigabytes。 但是,除非使用的是64位JVM,否则不能超过1GB(堆大小)。
如果您do the math使用特定用例,假设64位长* 100000000需要大约800MB的空间。
答案 1 :(得分:1)
您的计划是否要求您存储多头?如果你使用Integers而不是longs那么你可以存储更多,无论哪种方式,需要你在数组中存储这么多long?
其他解决方案:
当您使用参数-Xmx2G启动程序时,可以为程序提供更多堆空间 或其他长度大于标准512M或1G
您可以处理较少数量的数组值,然后将阵列保存到硬盘驱动器。然后处理数组的其余部分并将其存储到文件中。(需要基本的Java垃圾收集知识)
答案 2 :(得分:-1)
任何解决方案都取决于您尝试做什么。例如,如果您只想迭代值,则可以声明Iterator<Long>
:
Iterator<Long> myIterator = new Iterator<Long>() {
private long nextValue = 0;
@Override
public boolean hasNext() {
return nextValue < 100000000;
}
@Override
public Long next() {
return nextValue++;
}
@Override
public void remove() { throw new UnsupportedOperationException(); }
};
这样的解决方案具有O(1)
内存使用率,因为它不需要您存储超过下一个值的任何内容。但它可能不适合该应用程序。