Имя: Пароль:
1C
1C 7.7
v7: 1спп утечка памяти
,
0 Туц
 
13.08.13
10:40
//*******************************************
Процедура Сформировать()
    
    БД = СоздатьОбъект("ODBCDatabase");
    БДЗапрос = СоздатьОбъект("ODBCRecordSet");
    БДЗапрос.УстБД(БД);

       БДЗапрос.Выполнить("IF OBJECT_ID(N'tempdb..#тест', N'U') IS NOT NULL DROP TABLE #тест");  
    БДЗапрос.УстановитьТекстовыйПараметр("ТА",НачМесяца(ПолучитьДатуТА()));
       БДЗапрос.Выполнить("
    |SELECT *
    |INTO #тест  
    |FROM $РегистрИтоги.ОстаткиТМЦ Рег (nolock)
    |WHERE Рег.Period = :ТА
       |");  
       
    Рез = БДЗапрос.ВыполнитьИнструкцию("Select count(*) from #тест").ПолучитьЗначение(1,1);
    Предупреждение("В таблице " + Рез + " строк. Далее открываем диспетчер задач и наблюдаем утечку памяти.");    
       
    СчетчикЦикла = 0;
    Для СчетчикЦикла = 1 По 1000000 Цикл
        Рез = БДЗапрос.Выполнить("DELETE FROM #тест");
        Если Рез = 0 Тогда  
            Сообщить("Я упала, хотя вы этого может быть пока ещё не увидели ;( " + БДЗапрос.ПолучитьОписаниеОшибки());    
            БДЗапрос.Закрыть();    
            БД.Закрыть();
            Возврат;
        КонецЕсли;
        Форма.Заголовок(""+СчетчикЦикла);
    КонецЦикла;    
    БДЗапрос.Закрыть();    
    БД.Закрыть();
    
КонецПроцедуры
1 Туц
 
13.08.13
10:41
Аналогично если вместо DELETE использовать UPDATE.
2 Cube
 
13.08.13
10:41
(0) "v7: 1спп" - шо за зверь?
3 Туц
 
13.08.13
10:42
(2) здасьте! 1c++
4 Cube
 
13.08.13
10:42
(3) А, а я думал конфа так называется)))
5 1Сергей
 
13.08.13
10:45
информацию принял, продолжайте наблюдения
6 Злопчинский
 
13.08.13
11:01
я так и знал...
7 Туц
 
13.08.13
11:12
(5,6) О сколько чудных....
Без шуток, а что же делать? ;(
8 Злопчинский
 
13.08.13
11:14
(7) хз.. стучаться к авторам. хотя сомнительно. что исправят...
9 МихаилМ
 
13.08.13
11:15
(7)
указывать конкретную ТЗ
10 1Сергей
 
13.08.13
11:16
(9) ТЗ?
11 Туц
 
13.08.13
11:16
(9) это вброс?
12 КонецЦикла
 
13.08.13
11:22
Странно... не обращал внимания, было у меня такое, что тысячами (до миллиона не доходило) выполнялись маленькие запросики один за другим роботом (около 100 пользователей у целом), вроде все ОК было.
13 Туц
 
13.08.13
11:26
(12) На малых выборках похоже не проявляется.
14 Dolly_EV
 
13.08.13
14:56
(0) Повторил. Подтверждаю утечку. Причем в конкретном примере - не зависимо от размера выборки (13)

что в исходном виде, что вот в таком:
    |SELECT TOP 10 $Рег.Товар,$Рег.Количество
    |INTO #тест  
    |FROM $РегистрИтоги.ПартииТоваров Рег (nolock)
    |WHERE Рег.Period = :ТА
Память на клиенте отжирается процессом 1С с одинаковым приращением порядка 4 Мб/сек в первом и втором случае. На сервере с памятью - никаких изменений.
15 Dolly_EV
 
13.08.13
15:00
+(14) при этом если не обрывать по Esc обработку где-то на пороге до 500 Мб сожранной памяти - 1С после обрыва обработки при закрытии валится. Если меньше 500 Мб - то закрывается корректно
Естественного обвала не дождался - памяти на клиенте дюже много - досидел до 2 Гб (счетчик цикла = где-то на 300 000)
16 Злопчинский
 
13.08.13
23:38
..программисты такие программисты...
17 Попытка1С
 
14.08.13
01:28
На самом деле это печально..
18 ADirks
 
14.08.13
08:04
Нет утечек. 1С++ 3.2.4.0. 1С r25, с примочкой от spock'а

для интересу, попробуйте в начало запросов вставить
Set NoCount ON
обработка сообщений от ODBC - волшебная штука, и может приводить к печальным последствиям
19 Туц
 
14.08.13
08:30
(18) откуда 3.2.4.0? последняя же 3.2.2.0
20 Туц
 
14.08.13
08:34
(18) BINGO
Set NoCount ON
Спасибо, дорогой товарищ!
21 Dolly_EV
 
14.08.13
08:39
(19) 3.2.4.1 даже есть
(18) "обработка сообщений от ODBC - волшебная штука" - а можно по-подробнее?
Утечка пропала, причем, если в той же сессии 1С-а, оборвав выполнение и убрав "Set NoCount ON" снова запустить - утечка не появляется
22 Туц
 
14.08.13
08:41
(21) потому что этот параметр уже установлен.
23 Туц
 
14.08.13
08:41
(21) А где ж взять то 3.2.4.х?
24 Туц
 
14.08.13
08:42
Каюсь. На форуме.
25 Dolly_EV
 
14.08.13
08:44
(18) все, разобрался
26 ADirks
 
14.08.13
09:09
Когда вместе с результатом выполнения запроса сервер возвращает ещё и некие сообщения (типа (498 row(s)affected)), появляющиеся если не указать обратное, то в интерфейсе ODBC это как-то так передаётся, что фиг это обработаешь без бутылки. Поэтому в 1С++ сообщения не обрабатываются вообще. Но ODBC на это обижается - в данном случае пожирая память. А может и просто упасть.

Поэтому, Set NoCount ON ставится на автопилоте. И когда 1С внезапно падает от запросов, первое что делается - это текст засовывается в студию, чтобы посмотреть на мессаги.
27 ЧеловекДуши
 
14.08.13
09:11
(0) И где именно утечка? :)
28 ЧеловекДуши
 
14.08.13
09:13
(19) Вы отстали от жизни :)
29 ЧеловекДуши
 
14.08.13
09:16
(26) Как мило... тут получается уже проблема на уровне ODBC :)
30 ADirks
 
14.08.13
09:19
ну, типа того
думаешь, зря все 1С-ные sp-шки начинаются с этого заклинания?
31 ЧеловекДуши
 
14.08.13
09:27
(30) Не знаю... чета не обращал на это внимание :)