Страница: 1 | 2 |
Вопрос: Большой размер занимаемой памяти
Добавлено: 07.01.06 14:32
Автор вопроса: Mikhael | ICQ: 138809268
Собрался сделать маленькую программку для себя - типа "горячих клавиш". После запуска обнаружил что вообщем-то небольшая программа занимает аж 12 мб памяти.
Зачем так много?
Попытался уменьшить размер удалив по максимуму объекты.
Точнее объектов кроме формы не осталось вообще (даже таймер заменил на событие OnIdle)
Все равно 11мб.
В связи с этим куча вопросов:
1) зачем так много ресурсов надо?
2) можно ли уменьшить?
п.с. Суть программы такова. Отсеживает определённую комбинацию клавиш и запускает соотв софт с параметрами.
Реализация сделана через Forms.
Хотел сделать через Console Application, но не знаю как организовать там процедуру типа таймера или OnIdle.
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #1
Добавлено: 07.01.06 16:55
Насчет памяти и ее уменьшения:
http://www.gotdotnet.ru/DotNet/FAQ/CommonForum/Interop/524.aspx
Насчет таймера: используйте System.Threading.Timer.
Насчет горячих клавиш: почему бы не воспользоваться функцией Win32API
RegisterHotKey?
Номер ответа: 2
Автор ответа:
Mikhael
ICQ: 138809268
Вопросов: 15
Ответов: 14
Профиль | | #2
Добавлено: 07.01.06 18:15
за информацию спасибо, сейчас прочту.
там должны быть не обычые "горячие клавиши".
программка в качестве параметра вызова должна будет передавать содержимое буффера
Номер ответа: 3
Автор ответа:
Mikhael
ICQ: 138809268
Вопросов: 15
Ответов: 14
Профиль | | #3
Добавлено: 07.01.06 18:28
хм. попробовал - не сработало=(
объявил:
Public Declare Function SetProcessWorkingSetSize Lib "kernel32" Alias "SetProcessWorkingSetSize" (ByVal hProcess As Long, ByVal dwMinimumWorkingSetSize As Long, ByVal dwMaximumWorkingSetSize As Long) As Long
в процедуре вызвал:
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess.Handle.ToInt32, -1, -1)
что не так?
Номер ответа: 4
Автор ответа:
Mikhael
ICQ: 138809268
Вопросов: 15
Ответов: 14
Профиль | | #4
Добавлено: 07.01.06 18:42
Прочёл msdn там написано
если операция выполнена успешно, то вернётся не 0.
А если ошибка то SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess.Handle.ToInt32, -1, -1) =0
я проверил у меня 0
вызвал Err.LastDllError()
ответ 87.
это вроде ошибка ERROR_INVALID_PARAMETER
так какой параметр неверен?
Номер ответа: 5
Автор ответа:
Lexa
Вопросов: 1
Ответов: 1
Профиль | | #5
Добавлено: 08.01.06 23:25
2All:
Не понимаю ?
Открытая MDI форма весит в TaskManagere(TM) 13Мб
Откравем Child на нем 1 Таб(3стр), 3ListView'a, 3 TextBox'a в TM уже 36 Мб забито. При загрузке в 1 ListView значений 195 тыс Х 6 ТМ выдаёт 150 Мб ?
При закрытии Childa TM выдаёт 120 Мб ?
ListView заполняется через OleDb->ataConnect->ataReader затем Reader.Close, DataConnect.Close ?
При закрытии формы всем, кому мог прописал Dispose и приравнял к Nothing ?
куда уходит системная память ?
ListView жрёт так много памяти ?
каким образом можно определить количество памяти под переменные и объекты ?
Номер ответа: 6
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #6
Добавлено: 09.01.06 02:27
С этим надо просто смириться, имхо.
Столько памяти, я думаю, принесено в жертву НЭТу, который приходится как бы эмулировать на текущих операционках. И у меня есть некоторые надежды, что в Висте эти проги будут побыстрее.
Честно говоря меня бы больше устроил VB6.9, чтобы среда разработки была чуть удобнее, поддерживались без кривизны сабклассинг и многопоточность и, пожалуй, всё. Разные там готовые встроенные прелести НЭТа, которые до этого я реализовывал АПИшками меня не особо радуют ввиду некоторой притянутости за уши при их использовании.
Просто в этом случае желательно использовать одни и те же объекты для заполнения всего списка - иначе размер памяти у тебя уменьшиться только при сборке мусора, а когда она наступит - неизвестно.
Номер ответа: 7
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #7
Добавлено: 09.01.06 04:52
GC.Collect(0)
Номер ответа: 8
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #8
Добавлено: 09.01.06 07:45
Тогда уж эффективнее GC.Collect(2)
Номер ответа: 9
Автор ответа:
Lexa
Вопросов: 2
Ответов: 5
Профиль | | #9
Добавлено: 11.01.06 01:08
2All спасибо, а по поводу определения размеров объектов и переменных ? Что-то типа Len но для объектов ?
Номер ответа: 10
Автор ответа:
mich
ICQ: 261800349
Вопросов: 19
Ответов: 148
Web-сайт:
Профиль | | #10
Добавлено: 01.03.06 22:06
System.Diagnostics.Process.GetCurrentProcess.MinWorkingSet = New IntPtr(5000000)
Номер ответа: 11
Автор ответа:
mich
ICQ: 261800349
Вопросов: 19
Ответов: 148
Web-сайт:
Профиль | | #11
Добавлено: 01.03.06 22:07
уф..
Номер ответа: 12
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #12
Добавлено: 12.03.06 23:08
Парни, а SetProcessWorkingSetSize с параметрами -1,-1 реально работает!! после вызова этой API объем занимаемой памяти моей прогой сократился в 7!!!!!! РАЗ!!! (с 43Мб до 6,4Мб). Причем на производительности это никак не отразилось.. ))
Номер ответа: 13
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #13
Добавлено: 13.03.06 02:10
Ой, чудеса прямо таки В 7 РАЗ
Пример:
Делаю поиск файлов на винте. Найденные файлы (имя, размер, даты, аттрибуты и т.д.) складываю в массив.
По мере нахождения файлов размер массива достигает 19 Мб.
Теперь вызываю волшебную функцию
SetProcessWorkingSetSize с параметрами -1,-1
и вижу "выделение" памяти для процесса - 608 кБ ))))))))))))
Это что, мой массив из более, чем 50000 структур WIN32_FIND_DATA плюс остальная память программы поместились в 608 кБ ???
Каким таким чудесным образом??
)))
При этом все данные доступны для отображения в листвью
Теперь нажимаю колонку листвью, чтобы отсортировать файлы по алфавиту, и... Облом-с ) снова имеем 19 Мб.
А то, что SetProcessWorkingSetSize не меняет объем занимаемой программой памяти, можно увидеть, если перевести взгляд на статусбар таскменеджера, в котором указывается общее выделение памяти для всех процессов. Оно одинаково как до, так и после вызова волшебной ф-ции.
Плюс время сортировки возрастает на 25-30%.
Что на самом деле делает SetProcessWorkingSetSize описано в msdn:
The SetProcessWorkingSetSize function sets the minimum and maximum working set sizes for the specified process.
The working set of a process is the set of memory pages currently visible to the process in physical RAM memory. These pages are resident and available for an application to use without triggering a page fault
If both dwMinimumWorkingSetSize and dwMaximumWorkingSetSize have the value -1, the function temporarily trims the working set of the specified process to zero. This essentially swaps the process out of physical RAM memory.
Что означает не уменьшение памяти, занимаемой программой, а переброс этой памяти из ОЗУ в файл подкачки. С необходимостью потом доставать её оттуда с потерями времени, что видно на примере увеличения времени сортировки.
Увы, чудес не бывает...
Номер ответа: 14
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #14
Добавлено: 13.03.06 05:22
А у меня, если свернуть прогу то из 26 мегов остаётся полтора. И при последующем разворачивании начинается с 16 и потихоньку растёт (по мере замусоривания).
Номер ответа: 15
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #15
Добавлено: 13.03.06 22:16
HOOLIGAN, вот вечно ты так... вот взял, и все испортил! ) А если серьезно, то спасибо за разъяснения.. не все так безоблачно,как показалось на первый взгляд..