Mar*_*sis 1 java database heap-memory multidimensional-array nosql
我正在开发一个Java(Swing)的图像处理应用程序,它有很多计算.加载大图像时崩溃:
java.lang.OutOfMemoryError: Java heap space 由于以下原因:
double matrizAdj[][] = new double[18658][18658];
Run Code Online (Sandbox Code Playgroud)
所以我决定尝试一种轻松,尽可能快的数据库来处理这个问题.考虑使用表,因为它是一个2D数组,循环它将结果值插入到其他表中.
我也在考虑使用JNI,但由于我不熟悉C/C++而且我没有时间学习.
目前,我的问题是没有处理,只有堆超载.
我想听听解决这个问题的最佳选择.
编辑: 小解释:首先,我将二值化图像中的所有白色像素都放入列表中.可以说我有18k像素.然后我用该列表执行大量操作.像方差,标准偏差,协方差...继续...最后我必须乘以两个二维数组([2] [18000]和[18000] [2]),得到一个双[18000] [18000] ],是造成我的麻烦.之后,使用此2D阵列完成其他操作,从而产生多个大型2D阵列.
我无法处理需要大量RAM来使用这个应用程序.
好吧,为了琐事,你展示的那个矩阵消耗大约2.6Gb的RAM.所以,如果你决定追求这种机智,这就是你需要多少记忆的基准.
如果它对您有效,您可以将矩阵的行存储到数据库中的blob中.在这种情况下,您将拥有18658行,其上有一个序列化double[18658]商店.
我不会暗示这一点.
更好的方法是直接使用图像文件,并查看NIO和字节缓冲区以用于mmap将它们映射到程序空间.
然后,您可以使用DoubleBuffers之类的东西来访问数据.这样就可以将VM页面放在原始文件中,并且还可以将数据保留在Java堆中(而不是存储在与JVM关联的进程RAM中).最大的好处是它可以使这些怪物数据结构远离垃圾收集器.
当然,你仍然需要机器上的物理RAM,但它不是Java堆RAM.
但这可能是为您的流程访问此数据的最有效方式.