:: Visual Foxpro, Foxpro for DOS
Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
VFP 9 SP2
Win 7x64 (ОЗУ 16 Гб)

Вдруг напоролся на ошибку 43: There is not enough memory to complete this operation

Сама процедура может быть длительная (больше дня).
Схематично исходные такие (репро в данной ситуации не представляю как воссоздать):
- Открывается много таблиц (их может быть больше 1000 - типовые спр-ки), которые потом используются в цикле и участвуют в запросах.
По этой причине вначале их все и открываю, чтобы не дергать ОКТР/ЗАКР.
- В цикле основная обработка идет через запросы SQL, где собираются сводные данные в промежут. курсоры. После чего всё собирается в общую результатную таблицу. Тут еще использую
FLUSH IN (cCurCursNm) FORCE).
- Т.к. есть вложенные циклы + они "долгоиграющие", в неск. местах есть возможность прерывания:
IF INKEY()= 27
IF MESSAGEBOX('Остановить обработку?', 4+32+256, 'STOP', 60000)=6
lEsc= .T.
ENDIF
ENDIF

В какой-то момент (зависимость не нашел пока) вылетает эта ошибка.
Я уже понатыкал много запись в лог, но не могу поймать, где рушится.

Грешил на много открытых курсоров, но вроде до 65 тыщ алиасов можно.
Добавил закрытие всех временных курсоров (результатов запросов) СРАЗУ после ненадобности - стало меньше валиться, но не решило проблему.

Заковыка еще и в том, что ошибка не ловится обработчиком, а возникает просто по ходу в произвольных местах
Хотя весь цикл сидит внутри TRY CATCH ENDTRY

Курил тему по подобной ошибке и в инете и тут на форуме, но не могу найти у себя такие точки

1) Может ли влиять на такую ошибку неск вложенных опросов клавы через INKEY()?
Т.к. случается и полный зависон VFP при нажатии ESC: по логу видно, что дальше цикл остановился (в логе нет записей),
UI не реагирует на нажатие и VFP 25% проца жрет, но байтики памяти почти не пользует. При этом закрыть можно только убитием процесса Фокса.
2) Может ли FLUSH как-то мешать или наоборот хорошо что сбрасывает на диск?
3) Может ли помочь SYS(1104) / SYS(1016) / SYS(3050) или вообще не та тема?
4) Есть ли смысл в данном случае в закрытии времен. курсоров, если в следующей итерации цикла они открываются заново?

В какую сторону вообще копать?



Исправлено 2 раз(а). Последнее : VeterVFP, 17.05.22 16:04
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Ищи косяки в данных, которые используешь forum.foxclub.ru


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
PaulWist
Ищи косяки в данных, которые используешь forum.foxclub.ru
Эту тему видел. В открываемых таблицах есть МЕМО-поля, но они не используются мной вообще. Или сам факт наличия испорченного МЕМО-поля может вредить?

UPD. Ошибся, в используемых табл. нет МЕМО вообще.

Там неск десятков Гигов данных
При открытии таблиц никаких ошибок нет. И обработчик не ловит почему такую ошибку (как упоминал, ошибка рандомна)?



Исправлено 2 раз(а). Последнее : VeterVFP, 18.05.22 08:20
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> через запросы SQL
так бывает, когда соединяешь 1-2 ГБ-йтные таблицы, фокс строит промежуточные какие-то курсоры (временные файлы), а больше 2Г он не может файлы обслуживать, т.к 32-разрядный (хотя и 32-приложения могут работать с файлами > 2Г), но вот такие ограничения
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
of63
> через запросы SQL
так бывает, когда соединяешь 1-2 ГБ-йтные таблицы, фокс строит промежуточные какие-то курсоры (временные файлы), а больше 2Г он не может файлы обслуживать, т.к 32-разрядный (хотя и 32-приложения могут работать с файлами > 2Г), но вот такие ограничения
В моих таблица нет таких размеров (макс это 700-800 Мб).
Да и, если не ошибаюсь, там другая ошибка вылетает, если превышает курсор 2Гб - и она отлавливается обработчиком.
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
VeterVFP
При открытии таблиц никаких ошибок нет. И обработчик не ловит почему такую ошибку (как упоминал, ошибка рандомна)?

Не обязательно Мемо, могут быть индексы.

Предлагаю, открыть таблички и просканировать их обновив какое-то поле

replace MyField with MyField in MyCursor


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
А каков режим буферизации промежуточных курсоров?
М.б. полное отключение поможет. Все-таки где-то это хранится.
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
PaulWist
Не обязательно Мемо, могут быть индексы.

Предлагаю, открыть таблички и просканировать их обновив какое-то поле

replace MyField with MyField in MyCursor
Вчера спецом у всех табл индексы пересоздал. Но попробую предложенное
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
Taran
А каков режим буферизации промежуточных курсоров?
М.б. полное отключение поможет. Все-таки где-то это хранится.
Речь про CURSORSETPROP("Buffering", 1) глобально для всех открываемых?
В SET-ах у меня SET MULTILOCKS ON есть только.
Как проверить буф-ю именно для временных курсоров? Через CURSORGETPROP("Buffering", DBF('TempCurs'))?
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
VeterVFP
Вчера спецом у всех табл индексы пересоздал. Но попробую предложенное

Вот ещё, что может быть - это создание фоксом курсора без кляузы NOFILTER, те фактическое наложение фильтра на исходный алиас.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 18.05.22 09:56
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
VeterVFP
Taran
А каков режим буферизации промежуточных курсоров?
М.б. полное отключение поможет. Все-таки где-то это хранится.
Речь про CURSORSETPROP("Buffering", 1) глобально для всех открываемых?
В SET-ах у меня SET MULTILOCKS ON есть только.
Как проверить буф-ю именно для временных курсоров? Через CURSORGETPROP("Buffering", DBF('TempCurs'))?

Глобально для всех последующих открытий таблиц и курсоров задать третий параметр
CURSORSETPROP("Buffering", 1, 0)
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
VeterVFP
1) Может ли влиять на такую ошибку неск вложенных опросов клавы через INKEY()?
Т.к. случается и полный зависон VFP при нажатии ESC: по логу видно, что дальше цикл остановился (в логе нет записей),
UI не реагирует на нажатие и VFP 25% проца жрет, но байтики памяти почти не пользует. При этом закрыть можно только убитием процесса Фокса.

Касательно отлова Escape...
Не понравилась мне изначально такая идея.
Поэтому ваял небольшой COM/EXE сервер и запускал его при старте долгоиграющей процедуры.
В этом сервере одна кнопка "Прервать", которая меняет некоторый признак этого сервера-объекта, а основная программа отлавливает не нажатие Esc, а анализирует этот признак.
Сервер в отдельном процессе, поэтому реагирует адекватно на интерактив.
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
PaulWist
[Предлагаю, открыть таблички и просканировать их обновив какое-то поле
replace MyField with MyField in MyCursor
Прогнал таблы - никаких ошибок не выявлено. Всё корректно открылось и записалось.

Upd. Только что обратил внимание на "просканировать", а я открывал таблу и REPLACE поле 1й записи - индекс же должен перестроиться по-идее? Или обязательно REPLACE ALL сделать?



Исправлено 1 раз(а). Последнее : VeterVFP, 18.05.22 10:32
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
VeterVFP

Upd. Только что обратил внимание на "просканировать", а я открывал таблу и REPLACE поле 1й записи - индекс же должен перестроиться по-идее? Или обязательно REPLACE ALL сделать?

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


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
Просканировал и зареплейсил по всем записям - ошибок нет.
PaulWist
Вот ещё, что может быть - это создание фоксом курсора без кляузы NOFILTER
Значит лучше во все запросы добавить NOFILTER? Тогда оптимизация отключится ведь.

Taran
Глобально для всех последующих открытий таблиц и курсоров задать третий параметр
CURSORSETPROP("Buffering", 1, 0)
Т.е. проблема с памятью из-за нарастающего буфера может быть?
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
VeterVFP
Т.е. проблема с памятью из-за нарастающего буфера может быть?

Утверждать не буду, но буферизация - довольно таки вкусный ништяк.
А за все ништяки приходится расплачиваться ресурсами.
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Может есть какая-то динамически собираемая строка?
В каких-то случаях пишет "Слишком длинная строка", а именно нехватку памяти.
Нет рекурсии?


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
sphinx
Может есть какая-то динамически собираемая строка?
В каких-то случаях пишет "Слишком длинная строка", а именно нехватку памяти.
Нет рекурсии?
В данном цикле динамических строк нет, рекурсия тут тоже не используется.
Ошибка была только про нехватку памяти. Но не могу понять, почему она вылетает поверх процесса (замораживая его). Но при этом, если нажать ОК, то процесс идет дальше (т.е. обработчик не схватил её). И дальше может вылезать опять много раз.
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Не пробовал поставить задержку, типа WAIT '-----' WINDOW TIMEOUT 0.01?


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
sphinx
Не пробовал поставить задержку, типа WAIT '-----' WINDOW TIMEOUT 0.01?
А где? В начале какого-то из циклов?
Что она даст?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 28 (Гостей: 28)

© 2000-2024 Fox Club 
Яндекс.Метрика