none
Переполнение RRS feed

  • Вопрос

  • Всем привет, дорогие товарищи!

    C#

    Я или забыл, или, как обычно, не знаю...
    Программа запускает циклическую обработку данных,
    благополучно завершает отработку первой итерации,
    а в начале второй происходит переполнение -

    System.OutOfMemoryException

    Да и данных-то не сказать, что много.
    Причем, если начать обработку со второй,
    или любой другой порции данных,
    то переполнение наступает также в начале следующего цикла.
    В начале каждого цикла все массивы и словари обновляются.
    А что там еще может переполнять?
    Вопрос - как посмотреть, что там у меня творится,
    что еще не обнулилось?


    • Изменено QazRdx 8 октября 2017 г. 6:35
    8 октября 2017 г. 6:11

Ответы


  • Интересно и то,
    что я одновременно и согласованно запускал
    4 экземпляра экзешника этой программы
    и все они красиво и просто синхронизировались
    между собой и всем всего хватало.

    Ничего особо интересного или странного тут нет так как у процесса (в частности 32 битного) есть свои пределы на объем выделяемой памяти.

    Например, в ПК может быть много памяти, скажем 128ГБ. Однако, 32 битный процесс не сможет использовать такое количество так как он ограничен 32 битным виртуальным адресным пространством в 4ГБ (реально доступно меньше). С 64 битным приложением ситуация резко улучшается.

    В общем надо смотреть что и где выделяется приложением. Для этого используется memory profiler.

    Например:

    https://blogs.msdn.microsoft.com/dotnet/2013/04/04/net-memory-allocation-profiling-with-visual-studio-2012/


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа QazRdx 9 октября 2017 г. 0:42
    8 октября 2017 г. 16:43
    Модератор

Все ответы

  • Э, а конкретики можно? Код, или хотя бы что делает эта "обработка"?

    OutOfMemoryException возникает, когда CLR не может выделить непрерывный блок памяти указанной длины. Как следствие, оно типично при выделении больших массивов/List'ов или при обработке больших (> 10000x10000 пикс.) изображений средствами управляемого GDI+ и т.п.

    8 октября 2017 г. 9:36
  • Код достаточно большой -
    приводить его здесь смысла нет -
    я в нем и сам плаваю,
    хотя и написал его сам достаточно давно,
    больше 2-х лет тому назад.
    Интересно и то,
    что я одновременно и согласованно запускал
    4 экземпляра экзешника этой программы
    и все они красиво и просто синхронизировались
    между собой и всем всего хватало.
    Вот разве что в последующих версиях
    этот же массив я переделал в более сложный словарь.
    Работало, правда, помедленнее,
    но зачем-то ведь я его переделал.
    Видимо это как раз и связано с "непрерывным блоком".
    Попробую заново перейти к словарю.

    Спасибо!
    8 октября 2017 г. 10:50
  • Да, словарь не выделяет больших непрерывных блоков памяти, но высокой производительности с ним не ждите. Если у вас большие коллекции и не требуется произвольный доступ к элементам по индексу (т.е. вся обработка идет в циклах), может лучшим вариантом будет LinkedList - он обеспечивает довольно хороший баланс по памяти и скорости в таких условиях.
    8 октября 2017 г. 14:53

  • Интересно и то,
    что я одновременно и согласованно запускал
    4 экземпляра экзешника этой программы
    и все они красиво и просто синхронизировались
    между собой и всем всего хватало.

    Ничего особо интересного или странного тут нет так как у процесса (в частности 32 битного) есть свои пределы на объем выделяемой памяти.

    Например, в ПК может быть много памяти, скажем 128ГБ. Однако, 32 битный процесс не сможет использовать такое количество так как он ограничен 32 битным виртуальным адресным пространством в 4ГБ (реально доступно меньше). С 64 битным приложением ситуация резко улучшается.

    В общем надо смотреть что и где выделяется приложением. Для этого используется memory profiler.

    Например:

    https://blogs.msdn.microsoft.com/dotnet/2013/04/04/net-memory-allocation-profiling-with-visual-studio-2012/


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа QazRdx 9 октября 2017 г. 0:42
    8 октября 2017 г. 16:43
    Модератор
  • VadimTagil, спасибо за информацию! Да согласен.
    Ilya Tumanov, согласен,
    "ничего особо интересного или странного тут нет".
    На эту тему у нас однажды уже был разговор.
    Интересно то, как много воды утекло с тех пор,
    а мне пришлось вернуться к давно и незаслуженно забытой 
    версии моей программы, которую я до сих пор пытаюсь 
    довести до ума.
    Спасибо за ссылку - это как раз то, что надо.


    • Изменено QazRdx 9 октября 2017 г. 0:44
    9 октября 2017 г. 0:42