Russian Qt Forum

Программирование => Общий => Тема начата: alexman от Апрель 26, 2010, 20:34



Название: Доступная оперативная память?
Отправлено: alexman от Апрель 26, 2010, 20:34
Как узнать объем доступной оперативной памяти?


Название: Re: Доступная оперативная память?
Отправлено: Alex Custov от Апрель 26, 2010, 21:12
в каждой ОС по-разному. Тебе в какой?


Название: Re: Доступная оперативная память?
Отправлено: alexman от Апрель 26, 2010, 21:16
А кроссплатформенного решения нет?


Название: Re: Доступная оперативная память?
Отправлено: BRE от Апрель 26, 2010, 21:29
А что ты понимаешь под доступной оперативной памятью и для чего тебе нужна эта информация?


Название: Re: Доступная оперативная память?
Отправлено: alexman от Апрель 26, 2010, 21:43
Например, я хочу загружать из большого файла данные кусками! Хотелось бы знать какого размера кусок я могу прочитать в оперативку!?


Название: Re: Доступная оперативная память?
Отправлено: BRE от Апрель 26, 2010, 21:53
Например, я хочу загружать из большого файла данные кусками! Хотелось бы знать какого размера кусок я могу прочитать в оперативку!?
Процесс работает в виртуальном адресном пространстве. Сколько страниц физической памяти ему в данный момент предоставит ОС зависит только от нее. В следующий момент она может выгрузить большую часть страниц в своп и отдать физическую память другому процессу.
По большому счету эта информация бесполезна. IMHO, лучше выбирать размер кусков, основываясь на других соображениях.


Название: Re: Доступная оперативная память?
Отправлено: alexman от Апрель 26, 2010, 22:07
Например, я хочу загружать из большого файла данные кусками! Хотелось бы знать какого размера кусок я могу прочитать в оперативку!?
Процесс работает в виртуальном адресном пространстве. Сколько страниц физической памяти ему в данный момент предоставит ОС зависит только от нее. В следующий момент она может выгрузить большую часть страниц в своп и отдать физическую память другому процессу.
По большому счету эта информация бесполезна. IMHO, лучше выбирать размер кусков, основываясь на других соображениях.
Ну или, например, если мы хотим, чтобы наше приложение занимало в оперативке памяти не больше определенной константы!


Название: Re: Доступная оперативная память?
Отправлено: Igors от Апрель 27, 2010, 09:38
По большому счету эта информация бесполезна. IMHO, лучше выбирать размер кусков, основываясь на других соображениях.
Совершенно верно.

Например, я хочу загружать из большого файла данные кусками! Хотелось бы знать какого размера кусок я могу прочитать в оперативку!?
Буфер 4-6 Mb вполне достаточно. Больший буфер прироста в скорости не даст.

Ну или, например, если мы хотим, чтобы наше приложение занимало в оперативке памяти не больше определенной константы!
Это лучше задать на старте основываясь на размере физической памяти (напр 80%) и позволить пользователю менять это значение. И распределять основываясь на этом. Информация, полученная от ОС. будет динамична/неустойчива, напр. в какой-то момент памяти может быть мало (что-то мощное стартовало)  и.т.п.



Название: Re: Доступная оперативная память?
Отправлено: alexman от Апрель 27, 2010, 09:46
]Это лучше задать на старте основываясь на размере физической памяти (напр 80%) и позволить пользователю менять это значение.
Спасибо! Это понял!


Название: Re: Доступная оперативная память?
Отправлено: BRE от Апрель 27, 2010, 12:25
]Это лучше задать на старте основываясь на размере физической памяти (напр 80%) и позволить пользователю менять это значение.
Спасибо! Это понял!
Да не нужно привязываться к физической памяти. Эта величина тоже ничего не дает.
Предположим, что платформа 32 битная.
На машине установлено 512 Мб оперативной памяти, я очень сильно сомневаюсь, что приложение получит 80% от нее (имеется ввиду физическая память), ОС найдет ей другое применение.
Или на машине установлено 32 Гб оперативки, приложение физически (без дополнительных телодвижений) не сможет адресовать больше 4 Гб (а на самом деле в зависимости от ОС - 2 или 3 Гб).

Короче, не морочь себе пейсы.  :)


Название: Re: Доступная оперативная память?
Отправлено: Igors от Апрель 27, 2010, 15:28
Да не нужно привязываться к физической памяти. Эта величина тоже ничего не дает.
Дает. Разумеется, для 32-битного подсекаем размер физической памяти до 2 Gb. А вот если стоит всего 512, то ОС будет выделять, скажем, 1 Gb и больше - но с очень печальными последствиями. В 64-битах ситуация та же но в большем масштабе.

Короче, не морочь себе пейсы.  :)
Не морочу ввиду отсутствия таковых  :)


Название: Re: Доступная оперативная память?
Отправлено: BRE от Апрель 27, 2010, 15:34
Дает. Разумеется, для 32-битного подсекаем размер физической памяти до 2 Gb. А вот если стоит всего 512, то ОС будет выделять, скажем, 1 Gb и больше - но с очень печальными последствиями. В 64-битах ситуация та же но в большем масштабе.
Ну так а что в таком случае дает? :)
Если стоит 512 Мб, то 80% от нее ты вряд-ли получишь.
Тогда для чего все это?


Название: Re: Доступная оперативная память?
Отправлено: Igors от Апрель 27, 2010, 15:49
Ну так а что в таком случае дает? :)
Если стоит 512 Мб, то 80% от нее ты вряд-ли получишь.
Тогда для чего все это?
Можно "получить" (то есть выделить) и 160%. а когда и 300%  :) Разумеется я не узнаю "что" я получил, реальная ли это память или страницы на диске. Мне важно знать стОит ли выделять больше памяти или уже пришла пора обработать часть данных, выдать результаты и затем заниматься следующей порцией (пусть с накладными расходами). 


Название: Re: Доступная оперативная память?
Отправлено: BRE от Апрель 27, 2010, 15:51
Мне важно знать стОит ли выделять больше памяти или уже пришла пора обработать часть данных
Как ты это узнаешь? Особенно опираясь на размер физической памяти.


Название: Re: Доступная оперативная память?
Отправлено: Igors от Апрель 27, 2010, 16:08
Мне важно знать стОит ли выделять больше памяти или уже пришла пора обработать часть данных
Как ты это узнаешь? Особенно опираясь на размер физической памяти.
Просто вычисляем предельное (максимальное) значение один раз на старте. Ведем статистику сколько уже распределено. Сравниваем выделено - предел, напр.
Код:
size_t numLines = (MaxMem() - MemAllocated()) / lineSize;


Название: Re: Доступная оперативная память?
Отправлено: BRE от Апрель 27, 2010, 16:15
Просто вычисляем предельное (максимальное) значение один раз на старте. Ведем статистику сколько уже распределено. Сравниваем выделено - предел, напр.
Так а какое максимальное значение будет для 256, 512, 768, 1024, ... Мб
И почему ты думаешь, что при запуске одной и той же программы на одном и том же железе, ОС будет предоставлять одинаковое количество физической памяти?
Что пытаемся достичь такими расчетами размера буфера, если в любой момент времени ОС может забрать всю физическую память этого буфера выгрузив его в своп?
Для чего все это?