java - 在 Java 应用程序中处理大型二维数组的最佳选择是什么?

标签 java database multidimensional-array heap-memory nosql

我正在用 Java (Swing) 开发一个图像处理应用程序,它有很多计算。 加载大图像时崩溃:

java.lang.OutOfMemoryError: Java heap space 由于以下原因:

double matrizAdj[][] = new double[18658][18658];

所以我决定试验一个轻型、尽可能快的数据库来处理这个问题。考虑将表用作二维数组,循环遍历它,将结果值插入到其他表中。

我也在考虑使用 JNI,但是因为我不熟悉 C/C++,也没有时间学习。

目前,我的问题不是处理,只是堆重载。

我想听听我解决这个问题的最佳选择是什么。

编辑: 小解释:首先,我将二值化图像中的所有白色像素放入列表中。可以说我有 18k 像素。然后我对该列表执行了很多操作。像方差、标准差、协方差……等等……最后我必须乘以两个二维数组([2][18000] & [18000][2])得到一个double[18000 ][18000] 这给我带来了麻烦。之后再对这个二维数组进行其他操作,得到不止一个大的二维数组。

我无法处理需要大量 RAM 才能使用此应用程序的问题。

最佳答案

好吧,为了简单起见,您显示的矩阵大约消耗 2.6Gb 的 RAM。因此,如果您决定采用这种策略,那么这就是您需要多少内存的基准。

如果它对您有效,您可以将矩阵的行存储到数据库中的 blob 中。在这种情况下,您将有 18658 行,上面有一个序列化的 double[18658] 存储。

不过我不建议这样做。

更好的方法是直接使用图像文件,并查看 NIO 和字节缓冲区以使用 mmap 将它们映射到您的程序空间。

然后您可以使用诸如 DoubleBuffers 之类的东西来访问数据。这让 VM 在原始文件中尽可能多地分页,并且它还使数据远离 Java 堆(而是存储在与 JVM 关联的进程 RAM 中)。最大的好处是它使这些怪物数据结构远离垃圾收集器。

当然,您仍然需要机器上的物理 RAM,但它不是 Java 堆 RAM。

但这可能是为您的流程访问此数据的最有效方式。

关于java - 在 Java 应用程序中处理大型二维数组的最佳选择是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531704/

相关文章:

C++:整数数组[a][b][c] = {0};没有将所有值都设置为 0。该指令是错误的还是我的输出函数有问题?

c++ - 如何访问具有多个括号的一维数组以提高可读性?

java - 如何在JAVA中一次传递一个类的两个单独实例来对该类中的一些数据进行排序

java - Windows 将 JDK 位置引用保存在哪里?

database - 分解为第三范式 (3NF)

Java,如何从二维 double 组中查找特定值?

java - 如何使用 Hibernate 注释有条件地映射集合?

java - Couchbase、Spring 和 JPA

程序员应遵循的数据库设计规则

ruby-on-rails - 添加具有多个状态的列