for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

Ошибка 43 - There is not enough memory to complete this operation
VeterVFP
Автор

Сообщений: 389
Откуда: Москва
Дата: 17.05.22 16:02:31
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) Есть ли смысл в данном случае в закрытии времен. курсоров, если в следующей итерации цикла они открываются заново?

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



Исправлено: VeterVFP, 17.05.22 16:04
Ratings: 0 negative/0 positive

Re: Ошибка 43 - There is not enough memory to complete this operation
PaulWist

Сообщений: 14093
Дата: 17.05.22 16:27:55
Ищи косяки в данных, которые используешь forum.foxclub.ru


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

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

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

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

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



Исправлено: VeterVFP, 18.05.22 08:20
Ratings: 0 negative/0 positive

Re: Ошибка 43 - There is not enough memory to complete this operation
of63

Сообщений: 23002
Откуда: Н.Новгород
Дата: 17.05.22 21:34:19
> через запросы SQL
так бывает, когда соединяешь 1-2 ГБ-йтные таблицы, фокс строит промежуточные какие-то курсоры (временные файлы), а больше 2Г он не может файлы обслуживать, т.к 32-разрядный (хотя и 32-приложения могут работать с файлами > 2Г), но вот такие ограничения
Ratings: 0 negative/0 positive

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

Сообщений: 389
Откуда: Москва
Дата: 18.05.22 08:27:12
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

Сообщений: 14093
Дата: 18.05.22 08:30:50
VeterVFP
При открытии таблиц никаких ошибок нет. И обработчик не ловит почему такую ошибку (как упоминал, ошибка рандомна)?

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

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

replace MyField with MyField in MyCursor


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

Re: Ошибка 43 - There is not enough memory to complete this operation
Taran

Сообщений: 13137
Откуда: Красноярск
Дата: 18.05.22 08:47:27
А каков режим буферизации промежуточных курсоров?
М.б. полное отключение поможет. Все-таки где-то это хранится.
Ratings: 0 negative/0 positive

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

Сообщений: 389
Откуда: Москва
Дата: 18.05.22 09:40:46
PaulWist
Не обязательно Мемо, могут быть индексы.

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

replace MyField with MyField in MyCursor
Вчера спецом у всех табл индексы пересоздал. Но попробую предложенное
Ratings: 0 negative/0 positive

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

Сообщений: 389
Откуда: Москва
Дата: 18.05.22 09:46:52
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

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

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


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




Исправлено: PaulWist, 18.05.22 09:56
Ratings: 0 negative/0 positive

Re: Ошибка 43 - There is not enough memory to complete this operation
Taran

Сообщений: 13137
Откуда: Красноярск
Дата: 18.05.22 10:14:10
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

Сообщений: 13137
Откуда: Красноярск
Дата: 18.05.22 10:23:03
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
Автор

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

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



Исправлено: VeterVFP, 18.05.22 10:32
Ratings: 0 negative/0 positive

Re: Ошибка 43 - There is not enough memory to complete this operation
PaulWist

Сообщений: 14093
Дата: 18.05.22 10:40:51
VeterVFP

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

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


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

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

Сообщений: 389
Откуда: Москва
Дата: 18.05.22 12:02:50
Просканировал и зареплейсил по всем записям - ошибок нет.
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

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

Утверждать не буду, но буферизация - довольно таки вкусный ништяк.
А за все ништяки приходится расплачиваться ресурсами.
Ratings: 0 negative/0 positive

Re: Ошибка 43 - There is not enough memory to complete this operation
sphinx

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


------------------
"Вы поступили правильно, мой друг, но, боюсь, совершили ошибку"..."(с)
Ratings: 0 negative/0 positive

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

Сообщений: 389
Откуда: Москва
Дата: 19.05.22 08:48:05
sphinx
Может есть какая-то динамически собираемая строка?
В каких-то случаях пишет "Слишком длинная строка", а именно нехватку памяти.
Нет рекурсии?
В данном цикле динамических строк нет, рекурсия тут тоже не используется.
Ошибка была только про нехватку памяти. Но не могу понять, почему она вылетает поверх процесса (замораживая его). Но при этом, если нажать ОК, то процесс идет дальше (т.е. обработчик не схватил её). И дальше может вылезать опять много раз.
Ratings: 0 negative/0 positive

Re: Ошибка 43 - There is not enough memory to complete this operation
sphinx

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


------------------
"Вы поступили правильно, мой друг, но, боюсь, совершили ошибку"..."(с)
Ratings: 0 negative/0 positive

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

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



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

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

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