Что нового

Как обойти ограничение размера переменной 32767 ?

liond66

Новичок
Сообщения
117
Репутация
2
Здравствуйте.
В справке указано, что максимальный размер переменной MAX_ENVSIZE=32767
Можно ли увеличить это значение?
Спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Позвольте поинтересоваться, а где вы столкнулись с данным ограничением?
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
У меня есть довольно навороченный скрипт с циклом 3 минуты в среднем, а в нём дополнительные циклы.
На количество всех циклов назначены переменные, и значения переменных выводятся через GUICtrlSetData в поле Input.
Через два дня работы, когда самый большой счетчик доходит до 32 тысяч плюс (точно не запомнил), скрипт вываливается с ошибкой:
Error Allocating Memory.
При этом свободной памяти 1Gb, есть файл подкачки, Windows10x86
Поиском в интернете нашёл, что одной из причин может быть слишком большое значение переменной,
и после этого в справке обнаружил подтверждение: MAX_ENVSIZE=32767
Если такое количество циклов скрипт работает, а потом вываливается, то очень похоже, что именно из-за этого.
В другой версии того-же скрипта, где по условию счётчик показывает результат в 5 раз меньше, скрипт работал неделю без проблем!
Странно, что при создании простенького счётчика, эта ошибка не возникает.
Скрипт на работе. Взможно я использую бэта версию Autoit v3.3.15.0
Спасибо.
 

Hiki

Новичок
Сообщения
27
Репутация
1
MAX_ENVSIZE=32767 это не максимальный размер, а максимальная длина значения переменной, то есть количество знаков.
Ваш скрипт высчитывает расстояние между галактиками в миллиметрах?
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Hiki сказал(а):
MAX_ENVSIZE=32767 это не максимальный размер, а максимальная длина значения переменной

Я не уверен, поэтому и задал вопрос.
Тогды было-бы по английски "the maximum length of a variable value".
А в справке написано: "Maximum size for an ENV variable."

InnI сказал(а):
относится только к переменным окружения

Подскажите, где прочитать, что это именно так?
Спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
liond66 [?]
где прочитать, что это именно так
Вы это уже прочитали в справке: Maximum size for an ENV variable.
Перевод из русской справки: Максимальная длина значения переменной окружения.
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Я понял, спасибо.
Буду рад любым идеям, как продебагить имеющуюся проблему.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
liond66, строковые переменные в скрипте присутствуют? Добиться ограничения в 2,147,483,647 символов куда проще особенно если скрипт постоянно в них что-то дописывает
liond66 сказал(а):

Код:
;Наглядный пример ограничения
Local $sTest
While 1
	$sTest &= "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890" & _
			"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890"
WEnd
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Нашёл интересную тему
www autoitscript com/trac/autoit/ticket/257
Любой из трех приведённых там примеров приводит к ошибке Error Allocating Memory.
Разница только сколько памяти осталось: в первом примере ошибка возникает если остаётся (как и у меня!) 1Gb свободной памяти.
В последнем примере ошибка возникает если остаётся 500-600Mb свободной памяти.
Я не совсем понимаю содержание статьи. Вроде это баг Autoit и этот баг решён?
Может кто-то из гуру прокоментирует смысл указанного и я получу направление для решения проблемы моего скрипта.
Спасибо.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
liond66 выложите пример кода. Может можно сами циклы оптимизировать?
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Tempo сказал(а):
строковые переменные в скрипте присутствуют?
Такого нет. Но я должен проверить, чтобы быть уверенным, когда вернусь на работу.

hedji сказал(а):
Может можно сами циклы оптимизировать?

Оптимизировать конечно можно, но это не даёт ответ на вопрос, почему около 2-х дней скрипт бежит, совершая более 30 тыс циклов. Ну и если проблема не в счетчике, тогда я не знаю какой блок из разросшегося в 2000 строк скрипта нужно оптимизировать.
Спасибо.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Отключите 3 минутную задержку, чтобы пробегал 32000+ за несколько минут. При каждом проходе цикла вываливайте значения переменных в лог-файл.
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
3 минуты - это не задержка, а время выполнения работы:
запуск сторонней программы, ожидание завершения, обработка лога. :smile:
 

DStalker

Ботоводство+Мультибоксинг = время выспаться ;)
Сообщения
39
Репутация
2
А если костыли привязать?
В скрипте поставить таймаут на завершение в 6 утра. А,например, планировщиком задач ежедневно в 6 утра перезапускать скрипт?
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Спасибо всем за предложения. Попробую ответить, так как проблема остаётся.
- Текстовых переменных, которые изменяют своё значение нет, только в массивах (про массивы далее).
- Скрипт запускает две программы для непрерывного теста сетевого адаптера и специальной аудио карты.
После каждого цикла читает логи одной программы (постоянный размер 1 кв) и создаёт лог (тоже около 1 кв) другой програмы через StdoutRead.
Логи обрабатываются, используя массивы, и переменовываютя. После нажатия горячей кнопки, все логи обрабатываются, создаётся график и файл CSV.
Поэтому предложение остановить и перезапустить не подходит. График будет не полным. Это костыль! Я хочу понять проблему.
- Все массивы перезаписываются в последующим цикле, и не растут в размере (насколько я смог проверить!)
- Заменил версию 3.3.15-Beta на 3.3.14.3-Releaced
- в конце каждого цикла запускаю _WinApi_EmptyWorkingSet
- скрипт в памяти занимает 7-8Мв, в системе свободно 1.2Gb Ram

После 41 часа работы и счётчика циклов = 27000+, скрипт перестал распознавать данные логов первой програмы, и стал писать пустые логи второй программы :(
По нажатии на горячую кнопку, вылетел с ошибкой "aut2exe has stopped working" ! :( :( :(
Это моя первая програма, которая должна бежать такое продолжительное время. Autoit вообще предназначен для такой работы?!
Что участники форума думают об этом? И какие будут предложения?
Спасибо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
нужно начать логирование в то время, когда скрипт перестает распознавать данные и писать пустые логи.
я так понимаю, что программы 1 и 2 это сторонние. на автоит написан только обсуждаемый скрипт?
уже было предложено выложить скрипт для обозрения. 2000 строк не так много .
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Да, программы 1 и 2 сторонние.
Что подразумевается под логированием? Писать в файл значения переменных? Или что-то другое? Или есть какие то инструменты?
Что подразумевается под "начать логирование в то время..." ? Т.е. по горячей клавише ? Или опять таки запускается какой-то инструмент?
По горячей клавише, когда уже появилась проблема, я думаю не получиться, так как логика программы уже не работает.
Да и на работе я не все 24 часа :smile: А я так понимаю, что после нескольких часов такой некорректной работы и происходит вылет с ошибкой "Allocation memory error".
Есть ли какая нибудь программа для проверки логических ошибок кода ?
Может ли мне помочь Au3Striper ?
Код программы выложу в крайнем случае....
Спасибо за помощь!
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
liond66
работают функции в твоем коде по сбору и обработке инфы. тут все две тыщи строк и не нужно проверять. а только проверка в этих функциях. возможно, что и правда идет набора данных такого объема, что код крашится. если при нажатии горячей клавиши, то поиск сужается. можешь выложить этот кусок кода с пояснениями. возможно, найдется причина.
кстати, Allocation memory error может вызывать и api-функции, если они некорректно завершены.
плюс к этому, нужно описывать ошибки в коде. к примеру, функция не отработала, значит продолжения не должно быть. если не учтена ошибка в ключевом действии, то в итоге можно получить то, что ты получаешь
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
joiner сказал(а):
нужно начать логирование в то время, когда скрипт перестает распознавать данные и писать пустые логи.
Как начать логирование в процессе работы программы?

API и DLL функции не использую.

Если при анализе лога не находится нужное значение, функция считает попытку неудачной, отмечает в соответствующем счётчике и заходит на новый цикл.
Падать не должно. А в результате скрипт терпит крах!
В том единственном случае, когда я увидел начало проблемы, всё началось с пустого лога после
Run->ProcessWaitClose-> StdoutRead в файл.
Наверно эту часть в первую очередь я и выложу на форум.
Пока пытаюсь с Вашей помощью осмыслить проблему.
Спасибо.
 
Верх