我正在尝试创建一个类,它将充当 X 维度 ArrayList,其中包含 X 维度函数的输出。 该类工作正常,但内存消耗比应有的要高得多,因此我不能将它用于太高维度的太多值。
我考虑过从 double 更改为浮点,但我不允许在该项目中使用浮点。
public ArrayList<XDimensionArray> inception = new ArrayList<XDimensionArray>();
public ArrayList<Double> HistoricInputs= new ArrayList<Double>();
public ArrayList<Double> inputs = new ArrayList<Double>();
public ArrayList<Double> outputs= new ArrayList<Double>();
private int dimensionCourante;
private int dimensionMax;
public XDimensionArray(ArrayList<Pair> Tab_Limites,int _dimensionCourante,int precision,ArrayList<Double> _HistoricInputs)
{
HistoricInputs = _HistoricInputs;
dimensionCourante = _dimensionCourante;
dimensionMax = Tab_Limites.size();
for(Double i = Tab_Limites.get(dimensionCourante - 1).min; i < Tab_Limites.get(dimensionCourante - 1).max; i += 1./precision)
{
inputs.add(i);
if (dimensionCourante < dimensionMax)
{
ArrayList<Double> temp = new ArrayList<Double>();
temp.addAll(HistoricInputs);
temp.add(i);
inception.add(new XDimensionArray(Tab_Limites,dimensionCourante + 1,precision,temp));
}
if (dimensionCourante == dimensionMax)
outputs.add(SetOutput(i));
}
}
代码说明:您调用提供它的类
- 表示轴的最小/最大管数组,类根据该数组的大小猜测最大尺寸。
- 要生成的当前维度(第一次调用始终为 1)
- 表示轴的每个单位将创建多少个点的精度(在轴 -5;5 上,精度为 10,我们得到 100 个点,每个点之间有 0.1 个点) -输入的历史记录让我们知道当我们处于较低维度时谁是 Xdimension 数组的父级(基本上,当您处于第六维 XdimArray 时,您知道哪些 XdimArray 是您的父级“Xdim[0][8][例如4][2][10]”。
对于我们想要在轴上创建的每个点,
-如果这不是最低维度,我们用低一维的新对象填充 XdimensionArray 数组
-如果这是最低维度,我们最终填充输出数组。
运行每轴 100 个值和 4 个轴的程序意味着 100^4 个值( double ),这应该使用 100Mo 的内存,对吗?但我的程序耗尽了我给他的所有内存(2.2Go),但仍然不够。
3 维中的 100 个值应表示 10^6 个 double = 1Mo 该程序实际使用了500Mo(至少是能够运行的)
编辑:我尝试跟踪 4 个维度中每轴 100 个值发生的情况。该程序创建第一个第一维数组,然后创建 100 个第二维数组中的 26 个(及其所有第三和第四维数组),然后获取所有 2Go,程序停止
最佳答案
1004确实是一亿。列表中有 1 亿个条目,而不是 1 亿字节。
double
是 8 个字节的内存。但是您不使用 double,而是使用 java.lang.Double,它是一个对象,而不是原始值。我认为对象头是 16 个字节,因此 16+8 是 24 个字节。
并且您的 ArrayList 包含每个 Double 4 到 8 字节的引用数组(取决于您拥有 32 位还是 64 位 VM 以及是否使用压缩指针),因此每个 double 需要 28-32 字节。
这意味着您需要 2.8Gb(SI 单位)到 3.2Gb 的内存。
关于java - 知道为什么我的类(class)占用的内存比预期多得多吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55413443/