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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проблема с нехваткой памяти при работе программы

Проблема с нехваткой памяти при работе программы

Ответ
Поиск в этой теме
Непрочитано 23.09.2010, 10:36 #1
Проблема с нехваткой памяти при работе программы
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Программа записывает значения в файл, работает в цикле. Значений очень много и где-то после записи 2млн. значений выдает фатал еррор из-за нехватки памяти. Как можно это обойти...что бы память освобождалась или еще что?
Просмотров: 3580
 
Непрочитано 23.09.2010, 10:40
#2
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


на каком языке написана программа?
Хмурый вне форума  
 
Автор темы   Непрочитано 23.09.2010, 10:53
#3
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Пардон...AutoLisp
Мониторю в диспетчере задач и выделяемая память неумолимо ползет вверх(((
Zaghim вне форума  
 
Непрочитано 23.09.2010, 11:02
#4
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


попробуй в цикл вставить команду ЛИСП . удаляет из памяти информацию о наборах
Хмурый вне форума  
 
Непрочитано 23.09.2010, 11:03
#5
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,171


все 2 лимона значений постоянно хранятся в памяти и все требуются для вычислений?
Или для вычислений нужны только несколько текущих значений, а результаты последовательно пишутся куда-то в файл, насчитывающий 2 лимона записей?
Короче, код в студию

(gc) - не панацея
kp+ вне форума  
 
Непрочитано 23.09.2010, 11:05
#6
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


kp+, не панацея, но, хоть что-то
Хмурый вне форума  
 
Автор темы   Непрочитано 23.09.2010, 11:08
#7
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Конечно не нужны, получил 3 значения сформировал строку и выкинул ее в файл, файл остается открытым иду за след значением.
Причем использую те же переменные, просто их перебиваю на новые значения.
Zaghim вне форума  
 
Непрочитано 23.09.2010, 11:10
#8
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Zaghim, к тому что сказал Хмурый + эти функции, хотя может и kp+ прав и можно оптимизировать сам код:

(alloc <размер>) - устанавливает размер сегмента для последующего вызова функции expand

(expand <количество>) - отводит в памяти дополнительное количество сегментов для работы LISP

(gc) - выполняет сборку мусора (освобождает память от неиспользуемых данных)

Из книги AutoLisp и Visual Lisp в среде AutoCAD
Когда работают большие приложения, то может возникнуть необходимость высвобождения памяти в куче (heap), поскольку не хватает места для размещения очередной порции временных данных. В такой ситуации операция сборки мусора может принести пользу
TararykovDG вне форума  
 
Автор темы   Непрочитано 23.09.2010, 11:17
#9
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Попробовал впихнуть (gc) - результата не дало(((
Вот код:
Код:
[Выделить все]
(defun C:Prop ( / )

  (SETVAR "CMDECHO" 0)

  (setq ff (open "d:\\1.txt" "w"))

  (setq bp1 (getpoint "Введите точку"))
  (setq bp1x (car bp1))
  (setq bp1xs bp1x)
  (setq bp1y (car (cdr bp1)))
  (setq bp1p bp1)

  (setq z1 (list 0.0 0.0)
    z2 (list 10.0 0.0)
    esp 0.1)
  (setq terminate 1)
  
  (setq ug1 (angle z1 z2))                    ;0
  (setq ug2 (+ ug1 1.57079632679489655800))   ;90
  (setq ug3 (+ ug2 1.57079632679489655800))   ;180
  (setq ug4 (+ ug3 1.57079632679489655800))   ;270
  
 (while terminate
   (gc)

  (setq mp1 nil
    mp2 nil
    mp3 nil
    mp4 nil
  )
  (setq bp1p bp1) 
  
  (setq poi1 (polar bp1 ug2 1100))
  (setq dpoi (distance bp1 poi1))
  (setq ug ug2)
  (spoint)
  (setq mp1 a)
  (if (/= mp1 nil)
    (progn
      (setq mp1a (polar mp1 ug2 esp))
      (setq mp1b (polar mp1 ug4 esp))
      (command "erase" a1 "")
    )
  )  
  
  (setq poi2 (polar bp1 ug4 1100))
  (setq dpoi (distance bp1 poi2))
  (setq ug ug4)
  (spoint)
  (setq mp2 a)
  (if (/= mp2 nil)
    (progn
      (setq mp2a (polar mp2 ug2 esp))
      (setq mp2b (polar mp2 ug4 esp))
      (command "erase" a1 "")
    )
  )  

  (if (or (= mp1 nil) (= mp2 nil))
    (dvaline)
    (progn
      (setq poi3 (polar bp1 ug1 1100))
      (setq dpoi (distance bp1 poi3))
      (setq ug ug1)
      (spoint)
      (setq mp3 a)
      (if (/= mp3 nil)
        (progn
          (setq mp3a (polar mp3 ug1 esp))
          (setq mp3b (polar mp3 ug3 esp))
          (command "erase" a1 "")
    )
      )     
  
      (setq poi4 (polar bp1 ug3 1100))
      (setq dpoi (distance bp1 poi4))
      (setq ug ug3)
      (spoint)
      (setq mp4 a)
      (if (/= mp4 nil)
        (progn
          (setq mp4a (polar mp4 ug1 esp))
          (setq mp4b (polar mp4 ug3 esp))
          (command "erase" a1 "")
    )
      )
      (if (or (= mp3 nil) (= mp4 nil))
    (dvaline)
    (setq flag1 0)
      )    
    )
  )

  (if (and (/= mp1 nil) (/= mp2 nil) (/= mp3 nil) (/= mp4 nil))
    (calc)
    (progn
      (if (and (= mpa nil) (= mpb nil) (= mpc nil) (= mpd nil) (= mpe nil) (= mpf nil)) 
        (progn
      (setq bp1 bp1p)
          (setq bp1x bp1xs)
          (setq bp1y (car (cdr bp1)))
      (setq bp1y (+ bp1y 0.1))
          (setq bp1 (list bp1x bp1y))
    )
    (progn
        (setq bp1 bp1p)
      (setq bp1x (car bp1))
          (setq bp1y (car (cdr bp1)))
      (setq bp1x (+ bp1x 0.1))
          (setq bp1 (list bp1x bp1y)) 
    )  
      )
      (if (and (= mpa nil) (= mpb nil) (= mpg nil) (= mph nil) (= mpe nil) (= mpf nil))
    (setq terminate nil)
      )
    )
  )  
 );while
(defun spoint ()
  
  (setq b (cons 10 (inter bp1 ug dpoi)))
  (setq w (nth 1 b))
  (if (/= w nil)
    (progn
      (setq c (cons 0 "POINT"))
      (setq d (list c b))
      (setq a (entmakex d))
      (setq a1 (ssget "L"))
      (setq a2 (entget (entlast)))
      (setq a (cdr (assoc 10 a2)))
    )
    (setq a nil)
  )  

)


(defun inter (bp1 ug dpoi / ss)
  (If (setq
    ss (ssget "_F" (list bp1 (polar bp1 ug dpoi)))
      )
    (cadr (cadddr (car (ssnamex ss))))
  )
)
(defun dvaline ()
  
  (setq mp1 nil
    mp2 nil
    mp3 nil
    mp4 nil
    mpa nil
    mpb nil
    mpc nil
    mpd nil
    mpe nil
    mpf nil
    mpg nil
    mph nil)
  
  (setq flag1 1)
  (setq bp1p bp1)
  (setq par1 0
    par2 0
    par3 0
    par4 0)

  (setq poi1 (polar bp1 ug2 1100))
  (setq dpoi (distance bp1 poi1))
  (setq ug ug2)
  (spoint)
  (setq mpa a)
  (if (/= mpa nil)
    (progn
       (setq mpaa (polar mpa ug2 esp))
       (setq mpab (polar mpa ug4 esp))
       (command "erase" a1 "")
    )
  )  
  (if (/= mpa nil)
    (progn
      (setq bp1 (polar mpa ug2 0.3))
      (setq poi2 (polar bp1 ug2 1100))
      (setq dpoi (distance bp1 poi2))
      (setq ug ug2)
      (spoint)
      (setq mpb a)
      (if (/= mpb nil)
        (progn
           (setq mpba (polar mpb ug2 esp))
           (setq mpbb (polar mpb ug4 esp))
           (command "erase" a1 "")
       (setq par1 1)
           )
      )
    )
  )
  (setq bp1 bp1p)
  (setq poi1 (polar bp1 ug4 1100))
  (setq dpoi (distance bp1 poi1))
  (setq ug ug4)
  (spoint)
  (setq mpc a)
  (if (/= mpc nil)
    (progn
      (setq mpca (polar mpc ug2 esp))
      (setq mpcb (polar mpc ug4 esp))
      (command "erase" a1 "")
    )
  )
  (if (/= mpc nil)
    (progn
      (setq bp1 (polar mpc ug4 0.3))
      (setq poi2 (polar bp1 ug4 1100))
      (setq dpoi (distance bp1 poi2))
      (setq ug ug4)
      (spoint)
      (setq mpd a)
      (if (/= mpd nil)
        (progn
          (setq mpda (polar mpd ug2 esp))
          (setq mpdb (polar mpd ug4 esp))
          (command "erase" a1 "")
          (setq par2 1)
        )
      )
    )
  )    

  (setq bp1 bp1p)
  (setq poi3 (polar bp1 ug1 1100))
  (setq dpoi (distance bp1 poi3))
  (setq ug ug1)
  (spoint)
  (setq mpe a)
  (if (/= mpe nil)
    (progn
       (setq mpea (polar mpe ug1 esp))
       (setq mpeb (polar mpe ug3 esp))
       (command "erase" a1 "")
    )
  )  
  (if (/= mpe nil)
    (progn
      (setq bp1 (polar mpe ug1 0.3))
      (setq poi4 (polar bp1 ug1 1100))
      (setq dpoi (distance bp1 poi4))
      (setq ug ug1)
      (spoint)
      (setq mpf a)
      (if (/= mpf nil)
        (progn
           (setq mpfa (polar mpf ug1 esp))
           (setq mpfb (polar mpf ug3 esp))
           (command "erase" a1 "")
       (setq par3 1)
    )
      )
    )
  )  
  (setq bp1 bp1p)
  (setq poi3 (polar bp1 ug3 1100))
  (setq dpoi (distance bp1 poi3))
  (setq ug ug3)
  (spoint)
  (setq mpg a)
  (if (/= mpg nil)
    (progn
      (setq mpga (polar mpg ug1 esp))
      (setq mpgb (polar mpg ug3 esp))
      (command "erase" a1 "")
    )
  )
  (if (/= mpg nil)
    (progn
      (setq bp1 (polar mpg ug3 0.3))
      (setq poi4 (polar bp1 ug4 1100))
      (setq dpoi (distance bp1 poi4))
      (setq ug ug3)
      (spoint)
      (setq mph a)
      (if (/= mph nil)
        (progn
          (setq mpha (polar mph ug1 esp))
          (setq mphb (polar mph ug3 esp))
          (command "erase" a1 "")
          (setq par4 1)
        )
      )  
    )
  )

  (if (and (/= mpa nil) (/= mpb nil))
    (progn
      (setq mp1 mpa
            mp2 mpb)
      (setq mp1a mpaa
        mp1b mpab
        mp2a mpba
        mp2b mpbb)
    )  
  )
  (if (and (/= mpc nil) (/= mpd nil))
    (progn
      (setq mp1 mpc
        mp2 mpd)
      (setq mp1a mpca
        mp1b mpcb
        mp2a mpda
        mp2b mpdb)
    )  
  )
  (if (and (/= mpe nil) (/= mpf nil))
    (progn
      (setq mp3 mpe
            mp4 mpf)
      (setq mp3a mpea
        mp3b mpeb
        mp4a mpfa
        mp4b mpfb)
    )  
  )
  (if (and (/= mpg nil) (/= mph nil))
    (progn
      (setq mp3 mpg
        mp4 mph)
      (setq mp3a mpga
        mp3b mpgb
        mp4a mpha
        mp4b mphb)
    )  
  )

)
В CALC необходимые математические расчеты и запись в файл

Последний раз редактировалось Zaghim, 23.09.2010 в 11:22.
Zaghim вне форума  
 
Непрочитано 23.09.2010, 11:23
#10
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,171


удалено
kp+ вне форума  
 
Автор темы   Непрочитано 23.09.2010, 11:36
#11
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Что удалено?
В программе ищутся линии, которые лежат в одном из 4 направлений от точки. Ищутся разными способами в зависимости от того, нашлась ли линия, например, сверху от точки или нет. Затем беру свойства этой линии выполняю мат. расчет, формирую строку и записываю в файл.
Zaghim вне форума  
 
Непрочитано 23.09.2010, 12:08
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Причина утечки памяти в твоей программе связана с тем, что ты создаешь и удаляешь примитивы - при этом AutoCAD не освобождает память. Так уж он устроен. Освобождение памяти происходит при сохранении и закрытиии чертежа. Так что спасение только в кардинальном изменении алгоритма (о чем тебе уже неоднократно писали) или переходе на платформу x64 с достаточной памятью. Думаю, что изменить алгоритм проще. IMHO.

Последний раз редактировалось Александр Ривилис, 23.09.2010 в 15:27.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 23.09.2010, 12:10
#13
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Кажется понял как исправить алгоритм!!!! Причем ничего кардинального... просто не буду ставить точку и ее удалять, а лишь запоминать координаты!!!

Последний раз редактировалось Zaghim, 23.09.2010 в 12:27.
Zaghim вне форума  
 
Непрочитано 23.09.2010, 14:09
#14
ShaggyDoc

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


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Zaghim, к тому что сказал Хмурый + эти функции, хотя может и kp+ прав и можно оптимизировать сам код:

(alloc <размер>) - устанавливает размер сегмента для последующего вызова функции expand

(expand <количество>) - отводит в памяти дополнительное количество сегментов для работы LISP

(gc) - выполняет сборку мусора (освобождает память от неиспользуемых данных)
Эти функции были крайне необходимы в AutoCAD R10. Там для ЛИСП всего 64 Кб было доступно, из них 22 Кб занимал код самого интерпретатора. Да и вся память помните, сколько была? Вот этими функциями и пытались её на максимум использовать. Помогало. Теперь это незачем делать.

(gc) и сейчас помогает, но совсем немного. Чуть-чуть. В рассматриваемом случае всё из-за алгоритма. Разумеется, не надо ничего сразу стираемого рисовать. Но и формировать в памяти неограниченный файл не стоит. Вместо оперативной памяти начнет использоваться подкачка, резко упадет скорость.

Потом возникнет проблема с записью файла. Наверняка найдется другое решение. Например, запись-чтение в маленький файл.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 23.09.2010, 14:30
#15
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


В общем запустил на обработку 3 када, по одному на каждое ядро процессора. Один файл (тхт) должен получится, примерно, 300мб. Думаю это не сильно застопорит работу. Главное, что память не растет как сумашедшая...
Zaghim вне форума  
 
Непрочитано 23.09.2010, 21:15
#16
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Zaghim Посмотреть сообщение
В общем запустил на обработку 3 када, по одному на каждое ядро процессора. Один файл (тхт) должен получится, примерно, 300мб. Думаю это не сильно застопорит работу. Главное, что память не растет как сумашедшая...
Вы представляете себе, что это за объём - 300 Мб текста? 1 Мб текста примерно равен 400 страницам печатного текста.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 23.09.2010 в 21:51.
hwd вне форума  
 
Непрочитано 24.09.2010, 07:45
#17
ShaggyDoc

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


Цитата:
3 када, по одному на каждое ядро процессора
Это не решение... Впрочем, в свете продвигаемого чиновниками "масштабного внедрения суперкомпьютеров" можно в струю попасть.
Вообще-то задачи подобного вида решались даже в Автокад-10 под DOS с мизерной доступной памятью. А еще раньше - на "советских" ЭВМ МИР-1 всего-то с 48 Кб ОЗУ (вчера на хабре добрым словом помянули). Все за счет правильных алгоритмов...
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проблема с нехваткой памяти при работе программы



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема нехватки памяти при загрузке рисунков ADF AutoCAD 36 18.04.2009 22:34
небольшая проблема при работе мозг Разное 1 02.09.2007 18:20
Как делать левак(гребешки) на работе?? chd333 Разное 29 31.07.2007 09:45
Проблема при работе с блоками. _Дмитрий_ Программирование 6 27.09.2004 06:22
Проблема при работе с лейаутами zebs AutoCAD 2 16.09.2004 13:56