Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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-сайт: www.vbnet.ru
 Профиль | | #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->;DataConnect->;DataReader затем Reader.Close, DataConnect.Close ?

При закрытии формы всем, кому мог прописал Dispose и приравнял к Nothing ?

куда уходит системная память ?
ListView жрёт так много памяти ?
каким образом можно определить количество памяти под переменные и объекты ?

Ответить

Номер ответа: 6
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #6
Добавлено: 09.01.06 02:27
С этим надо просто смириться, имхо.
Столько памяти, я думаю, принесено в жертву НЭТу, который приходится как бы эмулировать на текущих операционках. И у меня есть некоторые надежды, что в Висте эти проги будут побыстрее.
Честно говоря меня бы больше устроил VB6.9, чтобы среда разработки была чуть удобнее, поддерживались без кривизны сабклассинг и многопоточность и, пожалуй, всё. Разные там готовые встроенные прелести НЭТа, которые до этого я реализовывал АПИшками меня не особо радуют ввиду некоторой притянутости за уши при их использовании.
ListView заполняется через OleDb->;DataConnect->;DataReader затем Reader.Close, DataConnect.Close ?

Просто в этом случае желательно использовать одни и те же объекты для заполнения всего списка - иначе размер памяти у тебя уменьшиться только при сборке мусора, а когда она наступит - неизвестно.

Ответить

Номер ответа: 7
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #7
Добавлено: 09.01.06 04:52
GC.Collect(0) :)

Ответить

Номер ответа: 8
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #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-сайт: belkyokushin.net
 Профиль | | #10
Добавлено: 01.03.06 22:06
System.Diagnostics.Process.GetCurrentProcess.MinWorkingSet = New IntPtr(500000)
        System.Diagnostics.Process.GetCurrentProcess.MinWorkingSet = New IntPtr(5000000)

Ответить

Номер ответа: 11
Автор ответа:
 mich



ICQ: 261800349 

Вопросов: 19
Ответов: 148
 Web-сайт: belkyokushin.net
 Профиль | | #11
Добавлено: 01.03.06 22:07
уф..
System.Diagnostics.Process.GetCurrentProcess.MaxWorkingSet = New IntPtr(5000000)

Ответить

Номер ответа: 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-сайт: neco.pisem.net
 Профиль | | #14
Добавлено: 13.03.06 05:22
А у меня, если свернуть прогу то из 26 мегов остаётся полтора. И при последующем разворачивании начинается с 16 и потихоньку растёт (по мере замусоривания).

Ответить

Номер ответа: 15
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #15 Добавлено: 13.03.06 22:16
HOOLIGAN, вот вечно ты так... вот взял, и все испортил! :-)) А если серьезно, то спасибо за разъяснения.. не все так безоблачно,как показалось на первый взгляд..

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам