Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Сборщик мусора, или как удалить все ненужные переменные по ключу после работы LISP-скрипта?

Сборщик мусора, или как удалить все ненужные переменные по ключу после работы LISP-скрипта?

Ответ
Поиск в этой теме
Непрочитано 26.07.2018, 16:58 #1
Сборщик мусора, или как удалить все ненужные переменные по ключу после работы LISP-скрипта?
OKJI
 
AutoLISP
 
Харьков
Регистрация: 19.06.2018
Сообщений: 101

Здравствуйте дорогие коллеги!)

Пишу запутанную логическую программу... И возникла проблема: оперативная память забивается уже почти на +500 МБ только от запуска этой программы...
А все из-за многочисленных временных переменных...

Ух сейчас начнут меня ругать!)))
Дело в том что связку " / х1 х2 х3 " мне категорически опасно использовать... мне иногда (чаще всегда) ряд этих переменных (вернее их результат) нужен в других участках программы (других функциях)

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

Как убрать весь оставшийся мусор с помощью: (setq mysor nil)?
Если мне известно Offtop: (я их так писал) что все переменные которые мне больше не нужны начинались с "v_"
__________________
Вечность это:
 (while T)
Просмотров: 4064
 
Непрочитано 26.07.2018, 17:27
#2
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Когда-то делал вот такую штуку:
в исполняемой программе составляется список переменных, например:
Код:
[Выделить все]
(setq glob '(c tvs td ori ug))
Когда надо, запускается вот такая программа:
Код:
[Выделить все]
(defun delglob ()
(setq ngl (length glob)) 
(setq nn 0)              
(repeat ngl             
    (set (nth nn glob) nil) 
    (setq nn (+ nn 1)) 
)
(setq ngl nil nn nil glob nil)
(princ)
)
В коде используется функция (set).
Setvar вне форума  
 
Непрочитано 26.07.2018, 17:30
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Цитата:
Сообщение от OKJI Посмотреть сообщение
связку " / х1 х2 х3 " мне категорически опасно использовать... мне иногда (чаще всегда) ряд этих переменных (вернее их результат) нужен в других участках программы (других функциях)
В эти "другие" функции передавай их как параметры вызова и не выдумывай велосипед.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.07.2018, 17:53
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от OKJI Посмотреть сообщение
Если мне известно Offtop: (я их так писал) что все переменные которые мне больше не нужны начинались с "v_"
atoms-family в помощь
Код:
[Выделить все]
(vl-load-com)
(setq v_loc1 1 v_loc2 "test" v_loc3 (list 1 2 3)) ;_Создаем глобальные переменные
(foreach item (vl-remove-if-not '(lambda(x)(wcmatch (strcase x) "V_*"))(ATOMS-FAMILY 1))
  (set (read item) nil)
  )
(gc)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.07.2018, 19:46
#5
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от OKJI Посмотреть сообщение
Как убрать весь оставшийся мусор с помощью: (setq mysor nil)?
думаю, что память это не вернет
Код:
[Выделить все]
нарисуй, например, линию
(setq v (entget (entlast)))
(setq i 0)
смотрим Task Manager
(repeat 100000 (set (read (strcat "temp" (itoa (setq i (1+ i))))) v))
смотрим Task Manager
(setq i 0)
смотрим Task Manager
(repeat 100000 (set (read (strcat "temp" (itoa (setq i (1+ i))))) nil))
смотрим Task Manager
на 100000 таких переменных уходит около 10М
как 500М сьесть?
Vov.Ka вне форума  
 
Непрочитано 26.07.2018, 20:38
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,005


наверно, с акадом вместе)
Сергей812 вне форума  
 
Непрочитано 27.07.2018, 05:35
#7
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
смотрим Task Manager
Windows освобожденную память не сразу освобождает. Некоторое время ждет, не понадобится ли снова. По крайней мере это относится к COM. Если же память освобождается из интерпретатора Лисп, который сам работает из-под Автокада - все сложнее.

Лучше, чем в коде VVA из #4 не сделаешь. Сборку мусора там выполняет (gc). Но результаты мгновенно не проявятся.

Но правильнее не допускать вообще лишних глобальных переменных - всё передавать аргументами. Причем в ЛИСП вообще ведь не обязательно создавать именованные переменные.
ShaggyDoc вне форума  
 
Непрочитано 27.07.2018, 06:53
#8
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Вы просто не умеете програмировать - пора курить SICP
ну или переходить на .NET и изучать ООП
ибо правильное програмировани на lisp требует особого просветления и не всем это удаётся...
trir вне форума  
 
Непрочитано 27.07.2018, 08:01
#9
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Замечу еще, что эта моя "штука" была придумана примерно в 1995 году, когда еще не было не только .NET, но и VLISP. И привел эту "штуку" я здесь только для того, чтобы продемонстрировать применение функции (set), использование которой в кодах AutoLisp не всегда очевидно и понятно. Функция (delglob) была составной частью переопределенного обработчика ошибок.
Setvar вне форума  
 
Автор темы   Непрочитано 27.07.2018, 15:49
#10
OKJI

AutoLISP
 
Регистрация: 19.06.2018
Харьков
Сообщений: 101
Отправить сообщение для OKJI с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
atoms-family в помощь
Код:
[Выделить все]
(vl-load-com)
(setq v_loc1 1 v_loc2 "test" v_loc3 (list 1 2 3)) ;_Создаем глобальные переменные
(foreach item (vl-remove-if-not '(lambda(x)(wcmatch (strcase x) "V_*"))(ATOMS-FAMILY 1))
  (set (read item) nil)
  )
(gc)


Спасибо большое!))) Все отлично сработало!))) Результат в минеатюре!)

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
на 100000 таких переменных уходит около 10М
как 500М сьесть?
Мои переменные в основном списки имеющие около 50 атомов в среднем... Думаю нормально набирается мусора!))

----- добавлено через ~9 мин. -----
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Но правильнее не допускать вообще лишних глобальных переменных - всё передавать аргументами. Причем в ЛИСП вообще ведь не обязательно создавать именованные переменные.
Если я начну работать без переменных сума сойду... там слишком сложная и запутанная логика.. мне от одной функции необходимо получить несколько разнотипных результатов... и потом их использовать в другой/других функциях... и там настолько все динамично... что полученная переменная может менять тип...
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot_1.png
Просмотров: 37
Размер:	28.1 Кб
ID:	204846  
__________________
Вечность это:
 (while T)

Последний раз редактировалось OKJI, 27.07.2018 в 16:50.
OKJI вне форума  
 
Непрочитано 27.07.2018, 16:45
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,005


Цитата:
Сообщение от OKJI Посмотреть сообщение
Если я начну работать без переменных сума сойду... там слишком сложная и запутанная логика.. мне от одной функции необходимо получить несколько разнотипных результатов... и потом их использовать в другой/других функциях... и там настолько все динамично... что полученная переменная может менять тип...
Откройте для себя ООП, классы и т.п.)
Сергей812 вне форума  
 
Автор темы   Непрочитано 27.07.2018, 17:03
#12
OKJI

AutoLISP
 
Регистрация: 19.06.2018
Харьков
Сообщений: 101
Отправить сообщение для OKJI с помощью Skype™


VVA,
Доработал ваше выражение до функции... вдруг кому-то пригодится:
Код:
[Выделить все]
 ;; Функция для удаления мусора по ключу
(DEFUN sk_gc (vl_str / i x item)
  (VL-LOAD-COM)
  (SETQ i 0)
  (WHILE (< i (LENGTH vl_str))
    (FOREACH item (VL-REMOVE-IF-NOT '(LAMBDA (x) (WCMATCH (STRCASE x) (STRCAT (nth i vl_str) "*"))) (ATOMS-FAMILY 1))
      (SET (READ item) nil)
    )
    (SETQ i (+ i 1))
  )
  (GC)
)

;; Пример применения
(sk_gc (list "v_" "vl_"))
----- добавлено через ~5 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Откройте для себя ООП, классы и т.п.)
Это же не джава... но подобие ООП само по себе получается...
До классов в моем случае нет необходимости доходить... в автоматизации составления технической документации нет никакой структуризации...

Был бы изначально план (алгоритм работы программы) можно было бы классами заморочиться...
но я пишу на чистую и что победил то и появилось в амплуа автоматизации...
__________________
Вечность это:
 (while T)
OKJI вне форума  
 
Непрочитано 27.07.2018, 17:19
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,005


Цитата:
Сообщение от OKJI Посмотреть сообщение
в автоматизации составления технической документации нет никакой структуризации...
как раз наоборот) Есть отдельные подзадачи хранения информации, ее обработки, отображения (в том числе и создание отчетов). И тогда программа из монстра с кучей глобальных переменных и функций превращается в что-то читабельное)
Сергей812 вне форума  
 
Автор темы   Непрочитано 27.07.2018, 17:33
#14
OKJI

AutoLISP
 
Регистрация: 19.06.2018
Харьков
Сообщений: 101
Отправить сообщение для OKJI с помощью Skype™


Цитата:
Сообщение от Setvar Посмотреть сообщение
Замечу еще, что эта моя "штука" была придумана примерно в 1995 году, когда еще не было не только .NET, но и VLISP. И привел эту "штуку" я здесь только для того, чтобы продемонстрировать применение функции (set), использование которой в кодах AutoLisp не всегда очевидно и понятно. Функция (delglob) была составной частью переопределенного обработчика ошибок.
Посмотрел я вашу штуку)) Прикольно работает...
Код:
[Выделить все]
 (DEFUN delglob ()
  (SETQ ngl (LENGTH glob))
  (SETQ nn 0)
  (REPEAT	ngl
    (SET (NTH nn glob) nil)
    (SETQ nn (+ nn 1))
  )
  (SETQ ngl  nil
        nn   nil
        glob nil
  )
  (PRINC)
)

(setq x1 1 x2 2 x3 3 x4 4 x5 5)
(set 'glob '(x1 x2 x3 x4 x5))
(delglob)
все х1...х5 отлично удаляются...
но для этого нужно перелопатить всю функцию... которая довольно большая получается (у меня так) и есть вероятность что-то пропустить...
по этому поиск по ключу и дальнейшее удаление лучше всего подходит...

----- добавлено через ~10 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
как раз наоборот) Есть отдельные подзадачи хранения информации, ее обработки, отображения (в том числе и создание отчетов). И тогда программа из монстра с кучей глобальных переменных и функций превращается в что-то читабельное)
Я же писал нет никакого плана у меня... я начал писать программу не зная что ЛИСП может... предполагалось сделать только автоматическое черчение одного чертежа... но в процессе я понял что можно сделать намного больше ... вот и делаю... и пока это что-то доделываю, вижу еще больший фронт работы где можно попытаться автоматизировать.
Чтобы все структурировать мне пришлось бы переписывать пол года своей работы... а это лучше застрелиться...

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

----- добавлено через ~13 мин. -----
И кстати... какие классы в ЛИСПЕ!? что то я подобного не видел... или функция состоящая из функций является классом?
__________________
Вечность это:
 (while T)
OKJI вне форума  
 
Непрочитано 27.07.2018, 17:49
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,005


Цитата:
Сообщение от OKJI Посмотреть сообщение
какие классы в ЛИСПЕ!? что то я подобного не видел... или функция состоящая из функций является классом?
в лиспе нет, а в всех остальных средствах разработки автоматизации для акада - VBA, ObjectRAX, NetApi - присутствует.

----- добавлено через 36 сек. -----
Цитата:
Сообщение от OKJI Посмотреть сообщение
мусор в реестре... хотя я больше доверяю глобальным переменным чем неизученному виндовскому реестру...
мусор в реестр пихать.. хмм..
Сергей812 вне форума  
 
Автор темы   Непрочитано 27.07.2018, 18:28
#16
OKJI

AutoLISP
 
Регистрация: 19.06.2018
Харьков
Сообщений: 101
Отправить сообщение для OKJI с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
мусор в реестр пихать.. хмм..
Имеется в виду данные (переменные числовые, строчные, и списки) которые мне нужны будут позже в следующих функциях...

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
в лиспе нет, а в всех остальных средствах разработки автоматизации для акада - VBA, ObjectRAX, NetApi - присутствует.
Пока-что до этого не дошел... боюсь эти языки не столь гибки как LISP...
__________________
Вечность это:
 (while T)
OKJI вне форума  
 
Непрочитано 27.07.2018, 18:57
#17
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
но для этого нужно перелопатить всю функцию... которая довольно большая получается
а не надо делать таких больших функций - делайте декомпозицию

Цитата:
Чтобы все структурировать мне пришлось бы переписывать пол года своей работы...
придётся и не раз

читайте SICP - там всё объясняют
trir вне форума  
 
Непрочитано 27.07.2018, 19:05
#18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,005


Цитата:
Сообщение от OKJI Посмотреть сообщение
Имеется в виду данные (переменные числовые, строчные, и списки) которые мне нужны будут позже в следующих функциях...
вы другого места не нашли для складывания своего "мусора"?)

Цитата:
Сообщение от OKJI Посмотреть сообщение
боюсь эти языки не столь гибки как LISP...
За гибкость надо платить - и в других языках есть, например, переменные типа object - которые могут использоваться совершенно разными способами. Но это влечет за собой дополнительные расходы ресурсов на обслуживание подобных переменных. Я бы не считал это особым достоинством - отсутствие типа переменных.
Сергей812 вне форума  
 
Непрочитано 30.07.2018, 08:49
#19
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от OKJI Посмотреть сообщение
мне от одной функции необходимо получить несколько разнотипных результатов... и потом их использовать в другой/других функциях... и там настолько все динамично... что полученная переменная может менять тип...
Разнотипные результаты в LISP возвращаются в одной переменной - списке. При этом и длина списка и типы элементов могут меняться. Это же не Бейсик.

А вот засорение глобальным мусором - самый худший путь. И дело даже не в расходовании памяти - сами запутаетесь.
Цитата:
Сообщение от OKJI Посмотреть сообщение
а это опять мусор с глобальными переменными или мусор в реестре... хотя я больше доверяю глобальным переменным чем неизученному виндовскому реестру...
В реестре не надо хранить мусор и изученность его совершенно не при чем. В реестр, в строго определенное место надо записывать данные, которые могут понадобиться для другого сеанса этой или другой программы. Может быть через год. Например, если для рисования колонны с размерами АхБ запрашиваются эти размеры, то разумнее их сохранить при выходе и восстанавливать при запуске программы. А при запросе размеров предлагать их по умолчанию. И эти же данные сможет использовать другая программа.

Боитесь реестра - пишите в XML или INI. Хотя реестр - самое быстрое хранилище.

Глобальные переменные могут и в ЛИСП использоваться, но количесво их должно быть минимальным, назначение тщательно продумано, имена должны иметь особый, легко узнаваемый вид. Обычно с личным префиксом, в верхнем регистре.

Сам AutoCAD создает множество глобальных ЛИСП-переменных. Выполните команду acadinfo и в созданном acadinfo.txt обнаружите множество глобальных. Свои тоже.

Не будете придерживаться базовых принципов - будут не программы а "взрыв на макаронной фабрике". И мозги будут во взрыве участвовать.
ShaggyDoc вне форума  
 
Непрочитано 30.07.2018, 17:34
1 | #20
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от OKJI Посмотреть сообщение
VVA,
Доработал ваше выражение до функции... вдруг кому-то пригодится:
Если нужно удалять для нескольких шаблонов, то нет необходимости i раз проходится по списку. Wcmatch сделает это за один проход
Мой вариант
Код:
[Выделить все]
 ;; Функция для удаления мусора по ключу
(DEFUN sk_gc (pattern)
  ;;;pattern - шаблон для сравнения (см ф-цию wcmatch)
  (VL-LOAD-COM)
  (FOREACH item (VL-REMOVE-IF-NOT '(LAMBDA (x) (WCMATCH (STRCASE x) (STRCASE pattern))) (ATOMS-FAMILY 1))
      (SET (READ item) nil)
    )
  (GC)
)

;; Пример применения
(sk_gc "v_*,vl_*")
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Сборщик мусора, или как удалить все ненужные переменные по ключу после работы LISP-скрипта?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как удалить ненужные слои FruSnork AutoCAD 33 08.12.2023 12:09
Можно ли удалить ненужные шрифты? Naz AutoCAD 24 17.03.2016 17:15
Команда PURGE, или как удалить действительно ненужные неиспользуемые элементы из файла AlphaGeo Программирование 45 15.06.2009 15:14
Не могу удалить папку (даже после переустановки винды) dextron3 Прочее. Программное обеспечение 21 22.01.2009 09:50
Как удалить участок трубы после вычитания? BM60 AutoCAD 11 24.12.2008 18:53