我正在用 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/