我正在加载大约100个3000x2000像素的FITS图像,然后将每个图像的像素值转换为矩阵并重新缩放矩阵并将每个图像添加到SET中。
但我的堆快速耗尽内存。 int矩阵集不应该占用太多内存吗? (我相信堆大约2GB,至少eclipse在给出错误之前使用2GB。)
所以我的想法是每个循环后每个新的Fits对象都存储在内存中。但是在循环结束后再也不需要了,所以我不知道为什么会这样。
有没有办法在不耗尽内存的情况下完成?每次运行程序时都会有不同数量的Fits文件。
Public Set<int[][]> rescaleFitsList(File[] fitsFileList){
Set<int[][]> rescaledFitsSet = new HashSet();
for(File fits: fitsFileList){
Fits f = new Fits(fits);
double bScale = f.getHDU(0).getBScale;
double bLinear = f.getHDU(0).getBLinear;
short[][] counts = (short[][])f.getHDU(0).getKernel();
int[][] rescaledFits = new int[counts.length][counts[0].length];
for(int i =0, i<counts.length, i++){
for(int j =0, j<counts[0].length, j++){
rescaledFits[i][j] = (int)(bScale * counts[i][j] + bLinear);
}
}
rescaledFitsSet.add(rescaledFits);
}
}
答案 0 :(得分:-1)
在Eclipse中启动的应用程序有自己的JRE(否则System.exit(0)
也会杀死Eclipse IDE)具有自己的VM设置(除Eclipse IDE之外)。所以确保在启动/运行配置中设置-Xmx
:运行&gt;运行配置...:参数选项卡: VM参数 字段。
每张像素一张int
(4字节)的100张3000x2000图像= 100 x 3,000 x 2,000 x 4字节= 2,400,000,000字节≈2.2GB。 2 GB可能没有足够的内存,但有3 GB它应该可以工作: -Xms3g -Xmx3g