我正在尝试创建一个充当X维ArrayList的类,该类将包含X维函数的输出。 该类可以正常工作,但是内存消耗比应有的要高得多,因此我不能在太大的维度中将其用于太多的值。
我曾考虑过将double更改为float,但不允许在该项目中使用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),仍然不够用。
3个维度中的100个值应表示10 ^ 6双精度= 1Mo 该程序实际上使用了500Mo(至少可以运行)
编辑:我尝试按照每轴100个值在4维中进行跟踪。该程序将创建第一个1r维数组,然后在100个2维数组(及其所有的3rd和4rst暗数组)中创建26个,然后取走所有2Go并暂停程序
答案 0 :(得分:1)
100 4 确实是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的内存。