我正在尝试创建一个类,它将充当X维ArrayList,它将包含我的X维函数的输出。该类工作正常,但内存消耗比它应该高得多,因此我不能将它用于太高维度的太多值。
我想过从double变为float但是我不允许在这个项目中使用浮动。
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));
}
}
代码说明:你调用给它的类
对于我们想要在轴上创建的每个点,
- 如果这不是最低维度,我们用一维较低的新对象填充XdimensionArray数组
- 如果这是最低维度,我们最终填充输出数组。
每轴和4轴运行100个值的程序将意味着100 ^ 4值(双倍)应该使用100Mo的内存吗?但我的程序吃掉了我给他的所有记忆(2.2Go),但仍然不够。
100个3维的值应该意味着10 ^ 6双打= 1Mo该程序实际上使用500Mo(至少它能够运行)
编辑:我尝试跟踪4维中发生的事情,每轴100个值。该程序创建了第一个第一维aray,然后是100个第二维数组中的26个(以及所有第3和第4个dim数组),然后所有2Go都被占用并且程序停止
1004确实是1亿。列表中有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的内存。