Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Работа с памятью в VFP / 21 сообщений из 21, страница 1 из 1
06.05.2008, 09:50
    #35296005
Работа с памятью в VFP
Столкнулся с такой проблемой: при открытии формы вываливается сообщение, что недостаточно памяти (not enough memory for map file)... там в енвиронменте формы вобщем-то дофига открывается таблиц и представлений... но такое сообщение появляется только на серваке, на котором пользователи работают в терминальном режиме (оперативки на нём 4 гига)... выход пока для них предложил такой: кому надо попасть именно в этот модуль программы, пусть запускают приложение посети... долго конечно, пока там все таблицы и представления по сетке загрузятся, но по крайней мере памяти клиентского компа хватает и сообщения такого нет...

в качестве решения проблемы решил копнуть в сторону функции SYS(3050) и посему хотелось бы получить от знающих людей некий хелп по работе с памятью в VFP и ответы на некоторые вопросы, которые у меня возникли в частности по функции SYS(3050):
1. В какой момент надо выделять память с помощью функции SYS(3050)? Можно непосредственно перед запуском формы (или какойнить процедуры) или лучше это сделать сразу при открытии приложения в стартовом файле проекта?
2. Надо ли потом после отработки (закрытия) формы (или после отработки процедуры) обратно освобождать память? Если это будет сделано в стартовом файде проекта, то при закрытии приложения память освободится автоматом?
3. Какие подводные камни есть тут? Например, навыделяю я щас памяти 10 первым пользователям, которые запустили приложения, а 11-му бац и вывалится сообщение о нехватке памяти уже при старте программы.

Буду признателен за любые дельные советы.
...
Рейтинг: 0 / 0
06.05.2008, 10:30
    #35296121
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью в VFP
Видел подобную ошибку при тяжелых запросах на компах где мало оперативки было (32 или 64Мб).

Если ошибка стабильно возникает - поиграйся с SYS(3050), опытным путем выведи нужное значение, но думаю SYS(3050) ничем не поможет.

Проверь следующее:
1. Непосредственно на серваке залогинься (без терминала) и запусти. Если ошибки не будет, то проблема как-то с терминалом связана.
2. Возможно памяти слишком много (была такая проблема у фокса), для проверки убавь памяти - вытащи или в boot.ini на серваке выстави 2ГГб
...
Рейтинг: 0 / 0
06.05.2008, 10:43
    #35296154
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью в VFP
КонецЦикла2. Надо ли потом после отработки (закрытия) формы (или после отработки процедуры) обратно освобождать память? Если это будет сделано в стартовом файде проекта, то при закрытии приложения память освободится автоматом?
При закрытии приложения любым способом (в т.ч. удалениие процесса через диспетчер задач) освобождение всех ресурсов используемых процессом (в т.ч. и памяти) делает операционка.
КонецЦикла3. Какие подводные камни есть тут? Например, навыделяю я щас памяти 10 первым пользователям, которые запустили приложения, а 11-му бац и вывалится сообщение о нехватке памяти уже при старте программы.
Такого не будет. Если фокс действительно больше использовать начнет, то свопится больше будет. Распределением памяти рулит менеджер памяти виндовса. Максимум что можешь получить - он ругнется что место в файле подкачки кончилось, думаю что до этого не дойдет.

Каждому процессу в Win32 выделяется 4Гб адресного пространства виртуальной памяти, а сколько реальной памяти зависит от того сколько процесс будет использовать, если реальной памяти нехватает, то происходит своп в файл подкачки, этим менеджер памяти виндовса занимается.
...
Рейтинг: 0 / 0
06.05.2008, 12:09
    #35296448
Работа с памятью в VFP
что значит "вывести с помощью SYS(3050) нужное значение"? и чего потом делать с этим "нужным значением"

Если работаешь на серваке с консоли, то такое сообщение тоже появляется. Значит, думаю, дело всё-таки не в терминале.

Фокс 6-ой, значит скорее всего проблемы памяти не то, что были, а остались...
...
Рейтинг: 0 / 0
06.05.2008, 12:28
    #35296519
Sergo S.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью в VFP
Была у нас такая проблема на серваке в 6-й версии. Появлялась время от времени на тяжелых продолжительных запросах, циклах. К сожалению, дельного совета в этом случае нет, т.к. в 6-ке никакие танцы с бубнами не помогут. Мы решили проблему переходом на 9-ку и новое серверное железо.
...
Рейтинг: 0 / 0
06.05.2008, 17:39
    #35297738
XAndy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью в VFP
КонецЦикла
Как сообщил представитель MS http://]http://forum.foxclub.ru/read.php?29,327460,327609#msg-327609, ошибка "Not enough memory for file map" может возникнуть, когда слишком много памяти отведено под файловый кэш. Регулируется функцией SYS(3050). По дефолту размер файлового кеша устанавливается исходя из имеющегося кол-ва памяти, но фокстим не рекомендует перешагивать 1GB.
...
Рейтинг: 0 / 0
07.05.2008, 08:42
    #35298561
Работа с памятью в VFP
ну я вобщем-то и интересовался как правильно пользоваться функцией SYS(3050). Как этой функцией отрегулировать файловый кэш, в каком месте лучше это делать?
...
Рейтинг: 0 / 0
07.05.2008, 09:08
    #35298592
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью в VFP
КонецЦиклачто значит "вывести с помощью SYS(3050) нужное значение"? и чего потом делать с этим "нужным значением"...
То и значит - подставляешь разные значения методом "научного тыка", запускаешь и смотришь как работает.

Посмотри предварительно какие значения фокс сам выбирает:
Код: plaintext
1.
? SYS( 3050 ,  1 )
? SYS( 3050 ,  2 )

А вызывать SYS(3050) думаю надо при старте проги.
...
Рейтинг: 0 / 0
07.05.2008, 09:10
    #35298593
Работа с памятью в VFP
Код: 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.
* setmemory.prg
LOCAL lnAvailableMem, lpMemoryStatus, lnPct

* Running on the desktop
DECLARE GlobalMemoryStatus IN Win32API STRING @lpMemoryStatus
lpMemoryStatus = REPLICATE(CHR( 0 ),  32 )
GlobalMemoryStatus(@lpMemoryStatus)

lnAvailableMem = CharToBin(SUBSTR(lpMemoryStatus,  13 ,  4 ))

*** EGL:  11 / 30 / 98  - Added the fine tuning option
lnPct =  1 
IF TYPE("goApp.nSetMemoryPct") == "N"
	lnPct = goApp.nSetMemoryPct
ENDIF
lnAvailableMem = (lnAvailableMem * lnPct)

*? lnAvailableMem
SYS( 3050 ,  1 , lnAvailableMem)
SYS( 3050 ,  2 , (lnAvailableMem/ 2 ) )

RETURN lnAvailableMem


***************************
FUNCTION CharToBin (tcWord)
***************************
	LOCAL lnChar, lnWord
	lnWord =  0 
	FOR lnChar =  1  TO LEN(tcWord)
		lnWord = lnWord + (ASC(SUBSTR(tcWord, lnChar,  1 )) * ( 2  ^ ( 8  * (lnChar -  1 ))))
	ENDFOR

	RETURN lnWord
ENDFUNC

...
Рейтинг: 0 / 0
07.05.2008, 09:48
    #35298696
Работа с памятью в VFP
Благодарствую...
Что такое goApp.nSetMemoryPct догадываюсь, но всё-таки....
...
Рейтинг: 0 / 0
07.05.2008, 10:03
    #35298741
Работа с памятью в VFP
это множитель,
изменя значение которого Вы можете
подобрать треб.итоговый размер
...
Рейтинг: 0 / 0
07.05.2008, 10:05
    #35298745
Работа с памятью в VFP
http://www.tek-tips.com/faqs.cfm?fid=3504
...
Рейтинг: 0 / 0
07.05.2008, 10:20
    #35298794
Работа с памятью в VFP
http://www.tek-tips.com/viewthread.cfm?qid=1449914&page=3
...
Рейтинг: 0 / 0
07.05.2008, 11:15
    #35298996
Работа с памятью в VFP
я имел в виду конкретно goApp.... я этот объект у себя не создаю.... если его нет, то как этот множитель должен выглядеть?
...
Рейтинг: 0 / 0
07.05.2008, 12:58
    #35299449
Мельник
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью в VFP
2КонецЦикла
Приветствую !

У меня тоже иногда вылезала такая ошибка при работе с достаточно большими таблицами и именно в терминальном режиме .
(Хотя пробовал и не в терминале – то же самое)

И пока во всех случаях проблема была в битости самих таблиц .
т.е. восстанавливал табличку из архива или лечил её и проблема исчезала .
Для себя сделал вывод , что портиться заголовок таблицы, система при открытии думает что в ней очень много записей и пытается для неё выделить память , которой не хватает для такого мнимого числа - отсюда ошибка на память !

(Не уверен конечно, это всё мои домыслы, но думаю что истинна где то близко:)
...
Рейтинг: 0 / 0
07.05.2008, 14:43
    #35299926
Работа с памятью в VFP
по коду, приведённому 12345вышелзайчикпогулять, вроде работает....
методом тыка выберая множитель большим, ошибка появляется, убавлю - работает...
вобщем, оставил пока 20% от lnAvailableMem, посмотрю как работать будет...
...
Рейтинг: 0 / 0
07.05.2008, 14:45
    #35299939
Работа с памятью в VFP
2 Мельник...

не в терминале (т.е. если или по сетке открываю приложение, или копирую всю базу себе на комп) всё работете, значит дело тут всё-таки не в битости таблиц...
...
Рейтинг: 0 / 0
07.05.2008, 15:20
    #35300093
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью в VFP
КонецЦиклапо коду, приведённому 12345вышелзайчикпогулять, вроде работает....
методом тыка выберая множитель большим, ошибка появляется, убавлю - работает...
вобщем, оставил пока 20% от lnAvailableMem, посмотрю как работать будет...
Я бы все-таки жестко зафиксировал значение, т.к. lnAvailableMem величина переменная (это та цифра которую диспетчер задач в "доступно" пишет). Меняться может в больших пределах. Завтра запустишь на компе где и так памяти свободной немного, еще обрежешь до 20% - совсем не останется.

Посмотри сколько у тебя на сервере 20% составляют и это значение используй. И менять лучше только в сторону уменьшения т.к. проблема от избытка памяти.

Что-то типа такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
lnX =  2  ^  29  &&  0 .5Гб - Максимальный размер используемой памяти
if val(SYS( 3050 ,  1 )) > lnX
   SYS( 3050 ,  1 , lnX)
endif
if val(SYS( 3050 ,  2 )) > lnX /  2 
   SYS( 3050 ,  2 , lnX /  2 )
endif
...
Рейтинг: 0 / 0
07.05.2008, 18:39
    #35300779
Работа с памятью в VFP
2DimaT

а если "<"?
...
Рейтинг: 0 / 0
07.05.2008, 19:24
    #35300862
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью в VFP
КонецЦикла2DimaT

а если "<"?

Как выше подтвердили - проблема возникает если больше, если меньше то фокс и сам прекрасно справляется с выбором размера буфера, зачем ему помогать?

В файл-серверном режиме на рабочих станциях где памяти не много у тебя ведь все нормально работает. Зачем там менять настройки, которые разработчики VFP заложили.

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

Можешь конечно поиграться с увеличением на компах где мало памяти, посмотри сколько твой тяжелый расчет работать будет.

На двух компах попробовал. Фокс похоже берет 85% от объема реальной оперативки под эти буфера:
Код: plaintext
? (val(sys( 3050 ,  1 )) + val(sys( 3050 ,  2 ))) /  2 ^ 20 , 'Мб'
Больше 85% от полного объема и не надо ставить, если фокс захочет всю память в буферах по максимуму использовать, то свободная вряд ли останется.
...
Рейтинг: 0 / 0
09.05.2008, 20:59
    #35304109
GrammerPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью в VFP
КонецЦиклану я вобщем-то и интересовался как правильно пользоваться функцией 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
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Работа с памятью в VFP / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]