Можно ли как-то определить, сколько еще оперативной памяти может выделить моя программа до исключения OutOfMemoryException?

Мне нужно это, чтобы определить, могу ли я полностью загрузить файл в ОЗУ с помощью File.ReadAllBytes (быстро) или обработать файл частями через FileStream, прочитав количество байтов, близкое к OutOfMemoryException, но достаточное, чтобы избежать этого.

Я делаю это, чтобы уменьшить нагрузку на жесткий диск. Я думаю, что лучше читать 1 ГБ сразу, чем делать циклы чтения, такие как: прочитать 4 байта -> обработать их -> снова прочитать 4 байта -> обработать их -> ...


person Kosmo零    schedule 20.06.2013    source источник
comment
Вы, как правило, не можете этого сделать, потому что память - это проблема ОС. Пробовали ли вы просматривать файлы с отображением памяти?   -  person Adam Houldsworth    schedule 20.06.2013
comment
Спасибо тебе за это. Я не знал, что они существуют в С#. Я использовал .net 2.0, и это новое в .net 4.0. Но я не знаю, насколько быстрый доступ к нему... Не только скорость, но и циклы чтения HDD должны быть оптимальными, вместо того, чтобы читать одни файлы и постоянно переходить от своего файла к другим.   -  person Kosmo零    schedule 20.06.2013


Ответы (1)


Распределение памяти зависит от того, насколько они загружены в данный момент. Вы не можете выбрать число и надеяться, что всегда сможете выделить столько места. Вы должны выбрать безопасный номер с низкой вероятностью отказа. Я полагаю, что потоки обычно используют буферы размером 1-8 МБ.

Загрузка жесткого диска будет более или менее одинаковой при одновременном чтении 1 Гб и чтении куском по 256 МБ 4 раза. В итоге: вы читаете 1 ГБ.

person ata    schedule 20.06.2013