Любая идея, почему мой класс занимает гораздо больше памяти, чем предполагалось? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь создать класс, который будет действовать как ArrayList измерения X, который будет содержать выходные данные для моей функции измерения 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));
    }
}

Объяснение кода: Вы называете класс, дающий ему

  • массив min / max бугорков, представляющих ось, от размераиз этого массива класс угадывает максимальное измерение.
  • Текущее измерение для генерации (первый вызов всегда равен 1)
  • точность, которая представляет, сколько точек будет создано на единицу оси (по оси -5; 5 с точностью 10 мы получаем 100 точек с 0,1 между каждым) -История входных данных, которая позволяет нам знать, кто является родителями массива Xdimension, когда мы находимся в более низком измерении (в основном, когда вы находитесь в 6-мизмерение XdimArray Вы знаете, какие XdimArrays являются вашими родителями, например, "Xdim [0] [8] [4] [2] [10]".

Для каждой точки wмы хотим создать по нашей оси

- если это не самое низкое измерение, мы заполняем наш массив XdimensionArray новыми объектами на одно измерение ниже

- если это самое низкое измерение, мыокончательно заполните выходной массив.

Запуск программы для 100 значений на ось и 4 оси будет означать 100 ^ 4 значения (двойные), которые должны использовать 100Mo памяти, верно?но моя программа съедает всю память, которую я ему дал (2.2Go), и этого все еще недостаточно.

100 Значения в 3 измерениях должны означать 10 ^ 6 doubles = 1Mo Программа фактически использует 500Mo (по крайней мере, она способнадля запуска)

РЕДАКТИРОВАТЬ: я попытался следовать тому, что происходит в 4 измерениях с 100 значений на ось.Программа создает первый массив 1-го измерения, затем 26 из 100 массивов 2-го измерения (и все их 3-й и 4-й dim-массивы), затем берутся все 2Go, и программа останавливается

1 Ответ

1 голос
/ 29 марта 2019

100 4 - это действительно 100 миллионов. 100 миллионов записей в вашем списке, а не 100 миллионов байтов.

A double - это 8 байт памяти. Но вы не используете double, вы используете java.lang.Double, который является объектом, а не примитивным значением. Я считаю, что заголовок объекта составляет 16 байтов, так что 16 + 8 составляет 24 байта.

А ваш ArrayList содержит массив ссылок от 4 до 8 байтов для каждого DOUBLE (в зависимости от того, используете ли вы 32-битную или 64-битную виртуальную машину и используете ли вы сжатые указатели), поэтому каждый дубль занимает 28-32 байта.

Это означает, что вам нужно от 2,8 ГБ (единиц СИ) до 3,2 ГБ памяти.

...