如何在不耗尽内存的情况下制作大型 3D 数组?

Posted

技术标签:

【中文标题】如何在不耗尽内存的情况下制作大型 3D 数组?【英文标题】:How do I make a large 3D array without running out of memory? 【发布时间】:2015-03-24 17:16:34 【问题描述】:

我有以下方法:

public static void createGiantArray(int size) 
    int[][][] giantArray = new int[size][size][size];

当我像这样以 10,000 的大小调用它时:

createGiantArray(10000);

我收到以下错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

如何在绕过内存异常的同时创建一个 10,000 x 10,000 x 10,000 的数组?

(我知道我当前的方法毫无意义并且失去了作用域。我没有发布附带的额外代码。)

【问题讨论】:

您可以将数组类型更改为更动态的类型(仅在需要时增加)或增加您的 java 内存以更改执行参数,例如Xmx 和 Xms 值 顺便说一句:10,000^3 == 1,000,000,000,000,即~931 GB 内存。真的吗? @dhke 正是我的想法,每个整数都是 4 字节,所以它实际上是 931 * 4 GB! 有什么理由需要这么大的数组吗?你用它做什么?你能重构它吗? 【参考方案1】:

如果数据相对稀疏,那么您可以使用不同的数据结构,如here 或here 所述。

【讨论】:

【参考方案2】:

不确定您是否意识到 10,000 x 10,000 x 10,000 整数(每个 4 字节)的 3 维数组总计 3725Gb!您可以使用-Xmx 标志增加堆大小,但这个数量仍然很大。

您需要更改程序的设计。

【讨论】:

这个问题本来是内存密集型的。我正在尝试创建一个需要解决的问题。但我不是故意让它那么密集。谢谢! 更糟糕的是,因为它是一个 3d 整数数组,所以也需要为整数子数组的对象指针留出空间。【参考方案3】:

基本上你无法在记忆中保留那个维度的结构。 每个 int 占用 4 个字节。 所以你有 10.000 x 10.000 x 10.000 x 4 字节 = 4.000.000.000.000 字节,大​​约是 4 TB。 您需要将数据保存在数据库(相当大的数据库)中并根据需要访问它们。 第二种可能性是将数据保存在分布式内存系统中,例如在许多服务器上的分布式哈希表。例如 4000 台服务器和 1 GB 内存。

【讨论】:

以上是关于如何在不耗尽内存的情况下制作大型 3D 数组?的主要内容,如果未能解决你的问题,请参考以下文章

Google Big Query + PHP -> 如何在不耗尽内存的情况下获取大型数据集

如何使用 Python Ray 在不耗尽内存的情况下并行处理大量数据?

如何在不耗尽内存的情况下部署包含 130,000 多个条目的脚本

如何在不使用太多内存的情况下强制下载大文件?

如何在不阻塞事件循环的情况下迭代大型列表

在不耗尽内存的情况下检索图像