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