@Alek_dr

Необработанное исключение типа «System.OutOfMemoryException» в mscorlib.dll. Что делать?

Имеется следующий метод на C#
public static List<Int64> Time(Printer P, BigInteger T)
    {
        List<Int64> res = new List<Int64>();
        Int64 d;
        Int64 current = 0;
        uint i = 1;
        while (current < T)
        {
            current = P.f * i;
            if (current < T)
                d = (Int64)T - current;
            {
                res.Add(current);          
                i++;
            }            
        }
        return res;
    }

Спустя i = 33554433 вылетает исключение System.OutOfMemoryException
Сущность его понятна, а что делать нет.
  • Вопрос задан
  • 1903 просмотра
Пригласить эксперта
Ответы на вопрос 3
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
- увеличить объем оперативной памяти, поставить х64 систему
- запускать приложение в облаке со снятым ограничением на оперативную память
- придумать алгоритм, который будет требовать меньше памяти
Ответ написан
Комментировать
@carbon88
.NET developer/ORM developer
1)Вы уверены что у вас элементов будет меньше чем int.MaxValue?
2)Выкиньте в топку этот List, можно оставить только если вам заранее известно количество элементов и вы можете инициализировать maxCapacity сразу. если нет то выкидывайте однозначно. Дело в том, что после 4-ой вставки (если мне не изменяет память) при каждой следующей вставке элемента Capacity увеличивается вдвое, соответственно массив элементов который там внутрях тоже увеличивается вдвое и элементы перегоняются в новый. представляете с какой скоростью растет массив? то есть на i = 33554433 + 1 list.Add() будет пытаться выделить кусок под 67108866 элементов, а это нужен непрерывный кусок памяти который к тому времени наверняка не находится и все падает с OutOfMemoryException. кстати же еще нужно хранит массив с которого будем копировать в тот который копируем. это огромная трата памяти. жесть просто.

Не знаю что у вас за код, который использует результат метода Time, но если там всего лишь перебор то этот ваш алгоритм это просто жесть, и наверняка можно вообще не использовать внутренний список, а выдавать посчитанное значение по мере необходимости через yield return и вычислять на лету.
Ответ написан
@Alek_dr Автор вопроса
Пожалуй, переделаю лучше код)
спасибо
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы