OutOfMemoryException

171
13 октября 2019, 15:50

У меня есть метод в классе, который создает список моих линий. Количество точек в одной линии может достигать 1700000 и больше.

private unsafe List<Line> GetLinesData()
    {
        var lineData = new short[LineCount];
        for (var i = 0; i < LineCount; i++)
        {
            _allLineData.Add(new Line(i));
        }
        if (DbHandle != IntPtr.Zero)
        {
            fixed (int* linesPointer = _lines)
            {
                fixed (short* lineDataPointer = lineData)
                {
                    for (var i = 10; i < DataCount - 10; i++)
                    {
                        var errorCode = NativeMethods.GetIndexDataSet(DbHandle, linesPointer, LineCount, i, lineDataPointer);
                        if (errorCode != Result.ErrorOk) continue;
                        for (var j = 0; j < LineCount; j++)
                        {
                            var point = new LinePoint(i - 10, lineData[j]);
                            _allLineData[j].Points.Add(point);
                        }
                    }
                }
            }
        }
        return _allLineData;
    }

Этот метод есть в двух моих приложениях и в одном он отрабатывает нормально, но в другом кидает OutOfMemoryException + для релиз версии ошибка появляется еще раньше. Вот память процесса для двух программ, при вызове этого метода:

Без ошибки

С ошибкой

В общем я не понимаю, почему не хватает памяти. И я не могу поставить платформу x64, так как используется dll x32. Надеюсь, что понятно объяснил)

Answer 1

Вы столкнулись с интересным явлением, которое называется "фрагментация памяти". Поздравляем. Оно происходит, когда перераспределение большого куска памяти для его увеличения (_allLineData[j].Points.Add(point);) перемежается с созданием некоторого количества небольших объектов (var point = new LinePoint(...);). Заказывайте количество элементов в _allLineData[j].Points сразу или вообще используйте массив.

READ ALSO
подключение к базам данных на c#

подключение к базам данных на c#

Есть база данных к которой подключается приложение через формуНа Форме есть textbox куда необходимо вписать параметры подключения к базе так...

159
Как в конце строки вставить многоточие?

Как в конце строки вставить многоточие?

Есть множество строк с тегами например: <p></p><p></p> <p></p>

126
как передать ajax POST на локальный сервер

как передать ajax POST на локальный сервер

Есть проект django, сервер apache2, система Ubuntu1804, в проекте js скрипт, из которого нужно отправить POST-запрос в php скрипт на локальном сервере

145
php - не создается zip архив

php - не создается zip архив

При создании zip архива в том же каталоге нет никаких ошибок, но архив не создаетсяВ php

148