|
|
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
Столкнулся с такой проблемой: при открытии формы вываливается сообщение, что недостаточно памяти (not enough memory for map file)... там в енвиронменте формы вобщем-то дофига открывается таблиц и представлений... но такое сообщение появляется только на серваке, на котором пользователи работают в терминальном режиме (оперативки на нём 4 гига)... выход пока для них предложил такой: кому надо попасть именно в этот модуль программы, пусть запускают приложение посети... долго конечно, пока там все таблицы и представления по сетке загрузятся, но по крайней мере памяти клиентского компа хватает и сообщения такого нет... в качестве решения проблемы решил копнуть в сторону функции SYS(3050) и посему хотелось бы получить от знающих людей некий хелп по работе с памятью в VFP и ответы на некоторые вопросы, которые у меня возникли в частности по функции SYS(3050): 1. В какой момент надо выделять память с помощью функции SYS(3050)? Можно непосредственно перед запуском формы (или какойнить процедуры) или лучше это сделать сразу при открытии приложения в стартовом файле проекта? 2. Надо ли потом после отработки (закрытия) формы (или после отработки процедуры) обратно освобождать память? Если это будет сделано в стартовом файде проекта, то при закрытии приложения память освободится автоматом? 3. Какие подводные камни есть тут? Например, навыделяю я щас памяти 10 первым пользователям, которые запустили приложения, а 11-му бац и вывалится сообщение о нехватке памяти уже при старте программы. Буду признателен за любые дельные советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2008, 09:50 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
Видел подобную ошибку при тяжелых запросах на компах где мало оперативки было (32 или 64Мб). Если ошибка стабильно возникает - поиграйся с SYS(3050), опытным путем выведи нужное значение, но думаю SYS(3050) ничем не поможет. Проверь следующее: 1. Непосредственно на серваке залогинься (без терминала) и запусти. Если ошибки не будет, то проблема как-то с терминалом связана. 2. Возможно памяти слишком много (была такая проблема у фокса), для проверки убавь памяти - вытащи или в boot.ini на серваке выстави 2ГГб ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2008, 10:30 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
КонецЦикла2. Надо ли потом после отработки (закрытия) формы (или после отработки процедуры) обратно освобождать память? Если это будет сделано в стартовом файде проекта, то при закрытии приложения память освободится автоматом? При закрытии приложения любым способом (в т.ч. удалениие процесса через диспетчер задач) освобождение всех ресурсов используемых процессом (в т.ч. и памяти) делает операционка. КонецЦикла3. Какие подводные камни есть тут? Например, навыделяю я щас памяти 10 первым пользователям, которые запустили приложения, а 11-му бац и вывалится сообщение о нехватке памяти уже при старте программы. Такого не будет. Если фокс действительно больше использовать начнет, то свопится больше будет. Распределением памяти рулит менеджер памяти виндовса. Максимум что можешь получить - он ругнется что место в файле подкачки кончилось, думаю что до этого не дойдет. Каждому процессу в Win32 выделяется 4Гб адресного пространства виртуальной памяти, а сколько реальной памяти зависит от того сколько процесс будет использовать, если реальной памяти нехватает, то происходит своп в файл подкачки, этим менеджер памяти виндовса занимается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2008, 10:43 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
что значит "вывести с помощью SYS(3050) нужное значение"? и чего потом делать с этим "нужным значением" Если работаешь на серваке с консоли, то такое сообщение тоже появляется. Значит, думаю, дело всё-таки не в терминале. Фокс 6-ой, значит скорее всего проблемы памяти не то, что были, а остались... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2008, 12:09 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
Была у нас такая проблема на серваке в 6-й версии. Появлялась время от времени на тяжелых продолжительных запросах, циклах. К сожалению, дельного совета в этом случае нет, т.к. в 6-ке никакие танцы с бубнами не помогут. Мы решили проблему переходом на 9-ку и новое серверное железо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2008, 12:28 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
КонецЦикла Как сообщил представитель MS http://]http://forum.foxclub.ru/read.php?29,327460,327609#msg-327609, ошибка "Not enough memory for file map" может возникнуть, когда слишком много памяти отведено под файловый кэш. Регулируется функцией SYS(3050). По дефолту размер файлового кеша устанавливается исходя из имеющегося кол-ва памяти, но фокстим не рекомендует перешагивать 1GB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2008, 17:39 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
ну я вобщем-то и интересовался как правильно пользоваться функцией SYS(3050). Как этой функцией отрегулировать файловый кэш, в каком месте лучше это делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 08:42 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
КонецЦиклачто значит "вывести с помощью SYS(3050) нужное значение"? и чего потом делать с этим "нужным значением"... То и значит - подставляешь разные значения методом "научного тыка", запускаешь и смотришь как работает. Посмотри предварительно какие значения фокс сам выбирает: Код: plaintext 1. А вызывать SYS(3050) думаю надо при старте проги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 09:08 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 09:10 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
Благодарствую... Что такое goApp.nSetMemoryPct догадываюсь, но всё-таки.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 09:48 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
это множитель, изменя значение которого Вы можете подобрать треб.итоговый размер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 10:03 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
http://www.tek-tips.com/faqs.cfm?fid=3504 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 10:05 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
http://www.tek-tips.com/viewthread.cfm?qid=1449914&page=3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 10:20 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
я имел в виду конкретно goApp.... я этот объект у себя не создаю.... если его нет, то как этот множитель должен выглядеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 11:15 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
2КонецЦикла Приветствую ! У меня тоже иногда вылезала такая ошибка при работе с достаточно большими таблицами и именно в терминальном режиме . (Хотя пробовал и не в терминале – то же самое) И пока во всех случаях проблема была в битости самих таблиц . т.е. восстанавливал табличку из архива или лечил её и проблема исчезала . Для себя сделал вывод , что портиться заголовок таблицы, система при открытии думает что в ней очень много записей и пытается для неё выделить память , которой не хватает для такого мнимого числа - отсюда ошибка на память ! (Не уверен конечно, это всё мои домыслы, но думаю что истинна где то близко:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 12:58 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
по коду, приведённому 12345вышелзайчикпогулять, вроде работает.... методом тыка выберая множитель большим, ошибка появляется, убавлю - работает... вобщем, оставил пока 20% от lnAvailableMem, посмотрю как работать будет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 14:43 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
2 Мельник... не в терминале (т.е. если или по сетке открываю приложение, или копирую всю базу себе на комп) всё работете, значит дело тут всё-таки не в битости таблиц... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 14:45 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
КонецЦиклапо коду, приведённому 12345вышелзайчикпогулять, вроде работает.... методом тыка выберая множитель большим, ошибка появляется, убавлю - работает... вобщем, оставил пока 20% от lnAvailableMem, посмотрю как работать будет... Я бы все-таки жестко зафиксировал значение, т.к. lnAvailableMem величина переменная (это та цифра которую диспетчер задач в "доступно" пишет). Меняться может в больших пределах. Завтра запустишь на компе где и так памяти свободной немного, еще обрежешь до 20% - совсем не останется. Посмотри сколько у тебя на сервере 20% составляют и это значение используй. И менять лучше только в сторону уменьшения т.к. проблема от избытка памяти. Что-то типа такого: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 15:20 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
2DimaT а если "<"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 18:39 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
КонецЦикла2DimaT а если "<"? Как выше подтвердили - проблема возникает если больше, если меньше то фокс и сам прекрасно справляется с выбором размера буфера, зачем ему помогать? В файл-серверном режиме на рабочих станциях где памяти не много у тебя ведь все нормально работает. Зачем там менять настройки, которые разработчики VFP заложили. С уменьшением все понятно - уменьшаем чтобы не глючило там где оперативки слишком много. При увеличении только до определенного момента хорошо будет - слишком много памяти дашь фоксу получишь тормоз от диспетчера памяти, т.к. ты даешь виртуальную память приложению, а если реальной памяти не будет хватать он свопить постоянно начнет. Можешь конечно поиграться с увеличением на компах где мало памяти, посмотри сколько твой тяжелый расчет работать будет. На двух компах попробовал. Фокс похоже берет 85% от объема реальной оперативки под эти буфера: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2008, 19:24 |
|
||
|
Работа с памятью в VFP
|
|||
|---|---|---|---|
|
#18+
КонецЦиклану я вобщем-то и интересовался как правильно пользоваться функцией SYS(3050). Как этой функцией отрегулировать файловый кэш, в каком месте лучше это делать? В начале программы до открытия таблиц среди прочих настроек делаю: local i * память ------------------------------- i = max(1048576, val(sys(3050, 1, 0))/3) && от 1Мб до тpети pекомендуемой фоксом i = min(1048576*200, i) && но не более 200 Мб, на всякий случай? =sys(3050, 1, i) && foreground, беpем часть памяти от захваченной фоксом по умолчанию =sys(3050, 2, i) && background pавен foreground ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2008, 20:59 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35298745&tid=1587802]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 403ms |

| 0 / 0 |
