none
доступный объём ОП для приложения C# в 32-разрядной ОС

    Вопрос

  • Программа создаёт несколько больших массивов в ОП и наполняет из значениями из файлов. Общий объём всех файлов менее 1,4 ГБ. Удаётся заполнить только первые шесть массивов объёмом 1 ГБ. При создании последнего массива в 350 МБ возникает исключение System.OutOfMemoryException. По сути, вся программа вместе с данными не должна занимать более 1,5 ГБ ОП. Что делать?
    17 июля 2017 г. 6:02

Ответы

  • Это ожидаемо, OOM  в таких случаях возникает при загрузке в пределах 800-1200 MB.

    https://blogs.msdn.microsoft.com/tom/2008/04/10/chat-question-memory-limits-for-32-bit-and-64-bit-processes/

    При таких размерах следует либо переходить на 64 bit либо загружать куда меньшие объемы данных.


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

    17 июля 2017 г. 6:22

Все ответы

  • Это ожидаемо, OOM  в таких случаях возникает при загрузке в пределах 800-1200 MB.

    https://blogs.msdn.microsoft.com/tom/2008/04/10/chat-question-memory-limits-for-32-bit-and-64-bit-processes/

    При таких размерах следует либо переходить на 64 bit либо загружать куда меньшие объемы данных.


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

    17 июля 2017 г. 6:22
  • Я вправе ожидать, что для приложения 32-разрядной Windows будет доступно чуть менее 2 ГБ. Не так ли?Но мне и 1,5 ГБ не доступно!

    17 июля 2017 г. 6:33
  • Спасибо, я ознакомился со статьёй по ссылке.
    17 июля 2017 г. 6:36
  • OutOfMemoryException возникает, когда CLR не может выделить непрерывный блок указанного объема. Т.е. память может быть доступна в необходимом количестве, но она представлена маленькими блоками из-за фрагментации после длительной работы приложения.

    Если выделения памяти под гигансткие массивы не избежать, пробуйте перезапускать программу после длительной работы, чтобы устранять фрагментацию памяти.

    17 июля 2017 г. 6:55
  • Позвольте и мне с моими 3 копейками...
    Взгляните сюда, подобная дискуссия здесь уже была.
    А действительно ли нужен такой объем в каждый данный момент времени?
    У меня тоже обрабатываются такие большие массивы,
    но у меня последовательная обработка,
    поэтому постоянно держать такую громаду в ОП нет смысла,
    и я периодически подгружаю данные.

    17 июля 2017 г. 10:32
  • Спасибо всем, кто поучаствовал в обсуждении. Но, у меня несколько необычный случай. Программа создана для работы в 64-разрядной ОС, а сейчас я пытаюсь сделать версию для 32-разрядной. И вот столкнулся с такой странностью. Собственно в исходном варианте программа использует 72 ГБ ОП. Ужал массивы как мог. Видимо придётся для 32-разрядной ОС организовывать работу с файлами на ЖД.
    • Изменено _goga 17 июля 2017 г. 11:05
    17 июля 2017 г. 11:00
  • Сама идея втиснуть приложение которое реально требовало 72GB RAM в 1-2GB весьма сомнительна. 

    В любом случае можете попробовать выделять неуправляемую память через, например AWE и использовать способ с указателями в ссылке выше. 


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

    18 июля 2017 г. 4:35
  • Задача использует предвычисленные массивы оценок для поиска оптимальной последовательности действий. Размер программы мизерный по сравнению с самими данными. А объём данных возрастает в 8-10 раз на каждом следующем уровне детализации. Соответственно, во столько же раз уменьшается время поиска решения, если все массивы расположены в ОП. Идея состояла в том, чтобы не меняя программы, разрешить за приемлемое время решать простые задачи на слабеньких компьютерах. Конечно, на решение той же задачи они бы тратили в 100 раз больше времени, но здесь цель другая – решать за 10-15 минут задачу в 100 раз проще, используя простаивающие мощности.

    Насчитаны массивы 6 ТБ, 650 ГБ, 72 ГБ, 9,5 ГБ, 1,4 ГБ. У меня была надежда, что 1,4 ГБ мне удастся «впихнуть» в 32-разрядную ОС. Не получилось. Идея менять только для этого программу мне не нравится. Видимо придётся решать более общую задачу для работы с данными на внешнем носителе, и дальше смотреть что удастся впихнуть в 32-разрядную ОС уже в таком варианте.


    • Изменено _goga 18 июля 2017 г. 11:19
    18 июля 2017 г. 11:12
  • ... еще пару копеек ...

    Сдается мне - Вы имеете дело с вообще безразмерной задачей,
    но хотите отделаться малой кровью, решить ее легко и красиво.
    К сожалению, это не всегда возможно,
    во всяком случае не на кондОвых компах.
    В свое время, когда мой младший сын учился в физмат школе,
    им задали разработать учебный проект по математике.
    Ну, мы с ним и включились, решили покувыркаться с пятнашкой.
    Это такая детская игрушка - квадратная коробочка с 15-ю костяшками, 
    1 - 15, 4 Х 4 с одним пустым местом.
    Нужно из начального произвольного состояния выстроить костяшки по порядку.
    Так вот оптимальное решение в общем виде для такой "простенькой" задачки 
    современным компам вообще не доступно, ни по объему памяти, ни по быстродействию.
    Для упрощенного варианта, для небольшого количества ходов,
    мы эту задачу решили, сын написал программу, 
    была даже несложная визуализация последовательных ходов.
    Как оказалось, существует целый класс решений подобных задач -
    ПОСЛЕДОВАТЕЛЬНОЕ УЛУЧШЕНИЕ РЕШЕНИЙ, см. интернет.
    У нас, правда, не было времени на изучение этих "мелочей", 
    и поэтому наша программа просто тупо перебирала возможные варианты.
    Питерские математики в жюри на математической олимпиаде у 
    Ж.Алферова долго допрашивали моего пацана,
    чтобы убедиться, что он сам эту программу написал,
    но в конце концов присудили ему гран-при.
    Приятно вспомнить...
    18 июля 2017 г. 12:51
  • Да, задача из этой серии. Делается попытка найти состояние системы с максимально длинным кратчайшим путём в исходное состояние. При том, что процедура построения кратчайшего пути известна, и она как раз реализована в программе. В терминах головоломок это звучит примерно так: ищется число Бога при наличии алгоритма Бога.


    • Изменено _goga 19 июля 2017 г. 2:52
    19 июля 2017 г. 2:28
  • Да-с! Ну что же, успехов Вам в Ваших дерзаниях!
    Можно предложить распараллеливание вычислений, но не между потоками, 
    поскольку это все равно одна и та же задача со всеми ее ограничениями, 
    а между несколькими задачами, запускаемыми из одного и того же исполняемого файла,
    каждая из которых обрабатывает очередной предвычисленный массив оценок
    из заготовленного списка таких массивов, с необходимой синхронизацией.
    Правда для этого и компьютер нужен покруче, 
    с соответствующими памятью и количеством процессорных ядер.
    Но можно попробовать и на имеющемся железе - попытка не пытка.
    Я года три назад для подобной проблемы специально купил себе крутой компьютер
    с 8 Гб памяти и 4-х ядерным процессором.
    • Изменено QazRdx 19 июля 2017 г. 4:02
    19 июля 2017 г. 3:59