Вход | Регистрация
    1  2
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: На каком объеме памяти падает 1с 7.7 на таблице значений

v7: На каком объеме памяти падает 1с 7.7 на таблице значений
Я
   Franchiser
 
20.07.19 - 23:21
Создал простую обработку:
Из 20 колонок.
Добавляю в них числовые значения.
Семёрка падает на диапазоне 500-600 тысяч строк. Объем памяти при этом процесса 900 - 1000 мб.
Это нормальный результат?
Как можно повысить используемый объем памяти и возможность добавления большего количества строк а тз?
(27-я платформа sql2008).
 
 
   Franchiser
 
101 - 05.08.19 - 19:44
Есть ли анлалог метода ТЗ ПолучитьСтрокуПоНомеру() , или Индексированной Таблицы НайтиСтроку() для valtable ?
   Djelf
 
102 - 05.08.19 - 19:50
(100) Это не проблема, есть же Информатор в 1с++
0000 LineNum
0000 НомерСтроки
0000 Очистить();
0000 КоличествоКолонок()
0000 НазваниеКолонки(f)
0000 НомерКолонки(f)
0000 ТипКолонки(f)
0000 Копия()
0000 КопиКолонку(f);
0000 Debug(f)
0000 УдалитьПоЗначению(f)
0000 УдалитьКолонку(f)
0000 УдалитьСтроку(f)
0000 УдалитьСтроки();
0000 НайтиЗначение(f)
0000 Первая()
0000 Получить(f)
0000 ПолучитьПоЗначению(f)
0000 ПолучитьСтроку()
0000 ПолучитьСтрокуПоНомеру(f);
0000 GetSelf()
0000 Множество(f)
0000 ПолучитьМножествоПоФильтру(f)
0000 ПолучитьПодмножество(f)
0000 ПолучитьИтоги(f)
0000 ПолучитьЗначение(f)
0000 Индекс(f)
0000 Последняя()
0000 КоличествоСтрок()
0000 КоличествоСтрокВПодмножестве(f)
0000 Загрузить(f);
0000 Макс(f)
0000 Мин(f)
0000 НоваяКолонка(f)
0000 НоваяСтрока(f)
0000 Следующая()
0000 OutDebug(f)
0000 Предыдущая()
0000 ПереименоватьКолонку(f);
0000 ВыбратьПоЗначению(f)
0000 ВыбратьСтроки()
0000 Установить(f);
0000 УстановитьПоЗначению(f)
0000 УстановитьЗначение(f);
0000 Показать(f)
0000 Сортировать(f);
0000 test(f)
0000 Итог(f)
0000 Выгрузить(f)
0000 Версия()
0000 Зарегистрированна()

   Djelf
 
103 - 05.08.19 - 19:52
+(102 ) В OtherTypesDefine.txt вставь строку 
addin.valtable,addin_valtable
ну и сам файл должен быть назван addin_valtable.ints
   Djelf
 
104 - 05.08.19 - 19:55
(101) Ха! В als то и нет ПолучитьСтрокуПоНомеру(), а такой метод есть ;)
   Franchiser
 
105 - 05.08.19 - 20:16
(130) добавил addin.valtable,addin_valtable,
переименовал als в ints в папке config/Intell
Не заработал телепат
   Franchiser
 
106 - 05.08.19 - 20:18
А понял, нужно было твой текст туда скопировать...
   Djelf
 
107 - 05.08.19 - 20:28
(106) Бывает ;)

P.S. Что-то не так у этой компонеты с регистрацией в 1С, кажется автор что-то недокурил...
Например "LineNum" в информаторе и в русском и в английском совпадают, но есть еще и "НомерСтроки", который тоже совпадает! И вообще ВСЕ методы в Информаторе представлены дважды (пришлось слегка поправить парсер в ints из Информатора).
Но если работает, то и так сойдет...
   Franchiser
 
108 - 05.08.19 - 20:29
(103) все получилось, спасибо!
   Franchiser
 
109 - 05.08.19 - 20:30
(107) что за Информатор, где он находится?
   Djelf
 
110 - 05.08.19 - 20:41
(109) В 1с++
Объект = СоздатьОбъект("ЧтоТоТам")
Информатор=СоздатьОбъект("Информатор");
тзСвойств = Информатор.ПолучитьТаблицуСвойств(Объект);
тзМетодов = Информатор.ПолучитьТаблицуМетодов(Объект);
   Злопчинский
 
111 - 05.08.19 - 20:56
и что будет в ТЗ этих? - инфа из метаданных?
   Djelf
 
112 - 05.08.19 - 21:05
(111) Будет инфа из ВК о наличии доступных свойств и методов для 1С.
Ну вот ты знал что в FormEx есть метод methCtrlInfo()? А он есть!
   Злопчинский
 
113 - 05.08.19 - 21:11
(112) яндекс знает всего две ссылки... ;-)
   Franchiser
 
114 - 05.08.19 - 22:22
(110) Понятно, действительно работает.
Как ты получил содержимое файла ints в (102), обработкой?
   Franchiser
 
115 - 05.08.19 - 22:40
У ValTable мне не нравится что в случае переполнения памяти Таблицы код не прерывается в excp и выдается много раз сообщение "Out of memory" в отличие от Индексированной Таблицы где происходит excp.
   Franchiser
 
116 - 05.08.19 - 23:18
Как бы отловить сообщение выдаваемое компонентой в окно сообщений "Out of memory"  ?
   Злопчинский
 
117 - 05.08.19 - 23:51
(116) как ты его отловишь - процесс-то идет, только если внешними приблудами по отношению к текущему процессу.
в 1С можно грабить окно сообщений через 1Spy.dll - инициирушь грабление - потом идет какойнить пароцесс - потом награбленное получаешь
и в последних формексах тоже чтото вроде есть
   Franchiser
 
118 - 05.08.19 - 23:53
(117) ну при добавлении строки в ТЗ возвращается номер добавляемой строки.
Так вот строка же не добавилась, значит этот метод не должен или возвращать новый номер, или же количество строк в тз не должно соответствовать этому номеру строки добавляемому.
   Franchiser
 
119 - 05.08.19 - 23:58
Вот такой код пробую, не фига остановить обработку не могу.
Процедура ValTable()
    
    ТзВал = СоздатьОбъект("AddIn.ValTable");

    ТзВал.НоваяКолонка("Колнка1",);
    ТзВал.НоваяКолонка("Колнка2");
    ТзВал.НоваяКолонка("Колнка3");
    ТзВал.НоваяКолонка("Колнка4");
    ТзВал.НоваяКолонка("Колнка5");
    ТзВал.НоваяКолонка("Колнка6");
    ТзВал.НоваяКолонка("Колнка7");
    ТзВал.НоваяКолонка("Колнка8");
    ТзВал.НоваяКолонка("Колнка9");
    ТзВал.НоваяКолонка("Колнка10");
    ТзВал.НоваяКолонка("Колнка11");
    ТзВал.НоваяКолонка("Колнка12");
    ТзВал.НоваяКолонка("Колнка13");
    ТзВал.НоваяКолонка("Колнка14");
    ТзВал.НоваяКолонка("Колнка15");
    ТзВал.НоваяКолонка("Колнка16");
    ТзВал.НоваяКолонка("Колнка17");
    ТзВал.НоваяКолонка("Колнка18");
    ТзВал.НоваяКолонка("Колнка19");
    ТзВал.НоваяКолонка("Колнка20");
    НомстрДо = 0;
    Для Сч = 1 по 3000000 Цикл
        Если  сч%100000 = 0 Тогда
            Сообщить("" +сч);
        КонецЕсли;
        
        Стр = "Стр_"+сч+"_";
        
        //Попытка    

            //Номстр = 0;

            Номстр = ТзВал.НоваяСтрока();
            
            Если ТзВал.КоличествоСтрок() <> Номстр Тогда
                Сообщить("Возникла ошибка памяти (Out of memory)");    
               Сообщить("Ном стр"+ Номстр); 
               Возврат;
        КонецЕсли;
        
        НомстрДо = Номстр;
        //Исключение

        //Сообщить("Возникла ошибка памяти");    

        //Возврат;    

        //КонецПопытки;

    ТзВал.Колнка1 = Стр+1;
    ТзВал.Колнка2 = Стр+2;
    ТзВал.Колнка3 = Стр+3;
    ТзВал.Колнка4 = Стр+4;
    ТзВал.Колнка5 = Стр+5;
    ТзВал.Колнка6 = Стр+6;
    ТзВал.Колнка7 = Стр+7;
    ТзВал.Колнка8 = Стр+8;
    ТзВал.Колнка9 = Стр+9;
    ТзВал.Колнка10 = Стр+10;
    ТзВал.Колнка11 = Стр+11;
    ТзВал.Колнка12 = Стр+12;
    ТзВал.Колнка13 = Стр+13;
    ТзВал.Колнка14 = Стр+14;
    ТзВал.Колнка15 = Стр+15;
    ТзВал.Колнка16 = Стр+16;
    ТзВал.Колнка17 = Стр+17;
    ТзВал.Колнка18 = Стр+18;
    ТзВал.Колнка19 = Стр+19;
    ТзВал.Колнка20 = Стр+20;
КонецЦикла;
    
Сообщить("Добавлено строк" + ТзВал.Количествострок());
КонецПроцедуры
   Злопчинский
 
120 - 06.08.19 - 02:25
вот это убери сч%100000
это очень прожорливая операция, замени на инкремент.
   Злопчинский
 
121 - 06.08.19 - 02:32
я с ValTable не работал...
.
Номстр = ТзВал.НоваяСтрока();
Если ТзВал.КоличествоСтрок() <> Номстр Тогда

если не срабатывает если - возможно новаястрока() - не добавляет новую строку и возвращает последнюю (успешно добавленную) строку и колвострок получается равно номстр.
попробуй проверять колвострок или номстр в сравнении с колвострок или номстр на предыдущем шаге.
.
правда нихрена не понял, зачем тебе этот код...
   Franchiser
 
122 - 06.08.19 - 08:21
(121) этот код чтобы завалить 1С и понять какой работается ошибка out of memory
   Franchiser
 
123 - 06.08.19 - 08:22
Работается = обрабатывается
   Franchiser
 
124 - 06.08.19 - 08:22
Я это проверяю для ТЗ, ИТЗ, ValTable
   Franchiser
 
125 - 06.08.19 - 08:25
(121) так я тоже проверял (с предыдущим шагом) тоже не работает.
Такое ощущение, что для valtable crash идёт в отличие о ТЗ и ИТЗ не на добавлении строки, а на присвоении значений по колонкам.
   Franchiser
 
126 - 06.08.19 - 08:28
Может быть есть какой то скрипт, который позволяет определить размер использованной оперативной памяти текущим процессом 1с, чтобы при приближении к границе вылета выдавать ошибку?
   АгентБезопаснойНацио
 
127 - 06.08.19 - 08:36
(126) ну через WSH можно же попытаться?
   Arbuz
 
128 - 06.08.19 - 13:43
Да она несколько кривовата, в итоге я отказался от неё и поменял логику процесса. Ошибку отслеживать через 1Spy. И я не указал, данные у меня были достаточно разрежены - очень много одинаковых значений в разных колонках, поэтому у меня так мало использовалось памяти. А я смотрю, ты заполняешь уникальными значениями - так может быть выигрыш очень незначителен.
   Arbuz
 
129 - 06.08.19 - 13:51
и эта... колонки надо обязательно типизировать. И ты в (0) указываешь "20 числовых колонок", а в (119) - используешь строки.


Синтаксис:
НоваяКолонка(<НазваниеКолонки>, [<ТипКолонки>="Объект"])
Параметры:
<НазваниеКолонки> - имена новых колонок через запятую, м.б. следующего формата:
"ТипКолонки: Колонка1, Колонка2,..., ТипКолонки: КолонкаН,КолонкаН1"
Если опущен и <ТипКолонки> и в во втором варианте не указан тип, тогда
по умолчанию создается колонка типа Объект.
Возвращает
номер новой колонки первой созданной
Типы колонок:
- Строка(String)
- Число(Number) - типа Double
- Целое(Int) - знаковое целое типа Int (4 байта)
- Объект(Object) - сохраняет значения любого типа
- Дата(Date) - тип дата (внутренее хранение данных аналогично типу Целое)
Тип "Строка". Операции сравнения (поиск, сортировка) для данного типа
происходят без учета регистра букв. В колонках данного типа, может сохраняться
строка не в том, регистре, который был присвоен (берется первое присвоение,
остальные - ссылки на первое).
Тип "Объект". Этот тип может хранить любые типы данных. Если в нем сохраняются
значения типа число, тогда по ним можно расчитывать итоги, а все не числовые
значения при расчете итогов будут приведены к числу по представлению. Тем
не менее, несмотря на возможность получения итогов по объектам, числа лучше
хранить в типах, предназначенных для этого - в этом случае это и быстрее
обрабатывается, и меньше занимает памяти.
Тип "Объект". В некоммерческой версии при попытке присвоить значение типа
>= 10, это значение будет сконвертированно в строку.
Пример:
т.НоваяКолонка("кл1");
т.НоваяКолонка("кл1,кл2", "Строка");
т.НоваяКолонка("Строка:кл1,кл2,Число:кл3");
   StanLee
 
130 - 06.08.19 - 13:58
7.7 еще сырая
 
 Рекламное место пустует
   Franchiser
 
131 - 06.08.19 - 14:23
(128) Уникальными я заполняю чтобы завалить процесс 1С специально
   Franchiser
 
132 - 06.08.19 - 14:27
Подскажите как в индексированной таблице сделать следующее:
Нужно в ИТЗ найти строку поиском по "коду", спозиционрироваться на нее, далее начиная с выбранной строки  продолжать получать строки ИТЗ и позционироваться пока "код предыдущий" = "код".
Начало понятно:
НомерСтр = ИТЗ.НайтиСтроку("ИндКод", СокрЛП(ТаблицаСтрокРН.Код), , 1)//тут я найду первую строку и спозиционируюсь

...//какие то действия со строкой


какой следующий метод применить?
   Franchiser
 
133 - 06.08.19 - 14:28
НайтиБлижайшуюБольше м.б. ?
   Arbuz
 
134 - 06.08.19 - 14:59
(132) индексировать и фильтровать по коду... хотя с твоими объёмами...
   Arbuz
 
135 - 06.08.19 - 15:05
(131) ну так заполняй числовыми данными и, желательно, их распределение подобрать близко к реальному, а иначе в чём смысл валить 1с?
   Franchiser
 
136 - 06.08.19 - 15:07
(135) Валить чтобы понять какой выбрать объект ИТЗ или ValTable
   Arbuz
 
137 - 06.08.19 - 15:12
да давно бы уже взял 1sqlite, создал локальную базу, сложил всё туда, и потом нормальным sql'ем оттуда всё вытаскивал. если база на диске, то в твоих условиях - считай безлимитная.
   Злопчинский
 
138 - 06.08.19 - 20:09
(93) не писал
   Salimbek
 
139 - 06.08.19 - 20:15
(132) На ИТЗ накладываешь фильтр по "коду" и далее полученную выборку просто перебираешь.
   Djelf
 
140 - 06.08.19 - 20:23
(132) Нам отсюда не видать что ты хочешь сделать, но могу предположить, что поможет метод ЛевоеСоединение http://www.1cpp.ru/docum/icpp/html/IndexedTable.html#leftjoin
   Franchiser
 
141 - 06.08.19 - 21:01
(139) да уже получилось 3-мя вариантами: найтистроку() + получитьследующий(), через установитьфильтр() и через Подмножество
   Franchiser
 
142 - 06.08.19 - 21:03
(140) мне как бы нужно, чтобы код сильно остался приближен к коду с использованием из, чтобы в случае чего все откатить или перейти на valtable. Инновации пока не нужны.
   Franchiser
 
143 - 06.08.19 - 21:07
(137) база сетевая, доступная с большого количества компов. Про sqllite я знаю, но локальный вариант наверно не подходит.
   Djelf
 
144 - 06.08.19 - 22:02
(143) А что тз, итз, vtable как то глобально умеют работать?
(142) Решается классами или эмуляцией через процедуры.
В любом случае если такой затык по памяти - нужно менять алгоритм, а не пытаться впихнуть невпихуемое ;)
   andrewalexk
 
145 - 07.08.19 - 07:37
(140) (144) :) джойны тоже имеют свой предел - вылетает примерно на таких же числах - походу предел движка 7.7
   Arbuz
 
146 - 07.08.19 - 13:43
(143) ты не понял - вместо тз,итз и т.д., куда ты сваливаешь свои биллионы строк - складывай в базу sqlite (локальную одноразовую), а потом уже запросами можешь очень гибко вынимать что хочешь. не думаю, что переписать логику первичного сбора с тз на скулайт будет сложно, в отличие, как я понял, от логики самого сбора и отказа от громадного локального накопления. поверь, 1sqlite - очень легка и быстра, как в освоении, так и в работе - спасибо, надо сказать, _Djelf'у_! и остальным
   Arbuz
 
147 - 07.08.19 - 14:04
а насчёт valtable - значения хранятся в отдельном дедуплицированном списке (хэшированная таблица, сортированный связный список - я не вникал как), а элементы valtable являются ссылками на этот список. что на большом количестве неуникальных (!) значений даёт выигрыш по памяти, тем больший, чем больше неуникальность значений. следствием такой реализации (не совсем проработанной) как раз и является то, что 'out of memory' происходит не во время добавления строк, а при присвоении значений.
что, собственно, как я вижу, ты со своими тестами не понимаешь катастрофически.
   Franchiser
 
148 - 07.08.19 - 16:30
(146) Да уже пофиг на объем памяти, мне нужно чтобы корректно обрабатывалась ошибка "out of memory": чтобы 1с не вылетала и можно было записать ошибку в лог. ТЗ и ValTable к сожалению с этой ошибкой работают криво, а ИТЗ - нормально
(144) Я знаю про классы, кажется Victuan такой писал и выкладывал на проклабе, но проклаб закрыли.
   Вафель
 
149 - 07.08.19 - 16:33
Напиши обертку декоратор и тогда невежно будет что ты используешь внутри
   Franchiser
 
150 - 07.08.19 - 16:37
(146) пока нет необходимости переписывать логику на sqllite (и так работает): это нужно создавать базу, потом она должна быть доступна по сети ото всюду, неизвестно какой будет замедление по сравнению  с ТЗ и т.д.
По какой то причине вылетала на ТЗ ошибка  "out of memory" но при этом строка в ТЗ не было очень много. Надеюсь с использование ИТЗ и увеличении памяти 1с7.7 ошибка больше не будет возникать, а если появится то будет ясно на каком месте кода.
   Вафель
 
151 - 07.08.19 - 16:39
(150) разве тз доступна везде? так скллайт делай локально
   Franchiser
 
152 - 07.08.19 - 16:40
(149) я не могу многие вещи переписать через обертку.
Например такой код:
ТЗ.КоличествоСтрок(КолСтр)
Далее ТЗ.ПолучитьСтрокуПоНомеру()
ИТЗ не может принимать в параметр КоличествоСтрок(). и нет метода ПолучитьСтрокуПономеру()
   Franchiser
 
153 - 07.08.19 - 16:41
(151) мне же прелагают базу делать SQLLite, значит нужно обращаться к файлу по пути.
А ТЗ в оперативной памяти.
   Вафель
 
154 - 07.08.19 - 16:41
(152) ты не понимаешь что такое обертка?
   Franchiser
 
155 - 07.08.19 - 16:43
(154) тем более значит не напишу, да и зачем на это время тратить. Универсальное всегда долго писать
   Franchiser
 
156 - 07.08.19 - 16:47
(154) обертка это вызов неких функций которые будут выполнять похожий код только методами ИТЗ
   Arbuz
 
157 - 07.08.19 - 17:15
(153) сейчас у тебя данных почти столько, сколько доступно памяти процессу 1с. допустим, путём беспощадного поедания кактусов ты таки победишь (0). и тут данных станет чуть больше, всё опять встанет? всё насмарку? новая тема на мисте - как положить 10 мультов строк в тз?
   Обработка
 
158 - 07.08.19 - 17:25
(0) Все не читал.
Не трахай себе мозг и другим просто переходи на 1с83.
   Обработка
 
159 - 07.08.19 - 17:28
Вот такие вот кулибины не дают умереть 1с77. И как результат приходят клиенты и просят перевести их с самописной базы в 1с 83.
   Arbuz
 
160 - 07.08.19 - 17:29
(158) и пиши там монстра получающего из оракла несколько гигов, и потом их в циклах перебирающих?
   Вафель
 
161 - 07.08.19 - 17:29
(159) перевод - слишком дорого, да и гемморойнее в разы для прога. ибо нужно людей переучивать и тд и тп.
слишком много конультантской работы. а оно надо?
   Arbuz
 
162 - 07.08.19 - 17:32
(159) ты так говоришь, как будто кулибины - это что-то плохое.
(161) таким как он как раз и надо, хлеб его же. бесконечное внедрение, а в 77 он не может.
   Обработка
 
163 - 07.08.19 - 17:37
(162) Да просто хочется работать с одним инструментом а не со всеми растянутыми в 20 лет.
   Arbuz
 
164 - 07.08.19 - 17:44
(163) ну мало ли кому чего хочется.
вот вам, понимаю, хочется взять клиентоса давно работающего на клюшках за жирок, выбросить всё, что работает и... пошло-поехало. меняем 1с. меняем парк. меняем ос. меняем ит. меняем бизнес-процессы. и всё это надолго и задорого и без вариантов.
   Arbuz
 
165 - 07.08.19 - 18:03
(153) ещё раз, медленно. тебе предлагается класть данные из выборок оракла не в тз, а в скулайт. база может быть и в памяти, и в файле, о чём тебе сказали в (75) и (78). понимаешь? другие клиенты 1с, доступ по сети, разворачивание сервера базы - вот это всё не имеет никакого смысла, от слова вообще. скулайт как замена тз. фирштейн? и потом красиво и масштабируемо делаешь выборки. скорее всего, что даже со скулайтом на диске (кэш то всё равно в памяти, плюс индексация) будет быстрее в разы текущего варианта на тз.
надеюсь что импорт из оракла то, хотя бы не через текстовый файл сделано?
   Djelf
 
166 - 07.08.19 - 18:03
(150) С какой стати база sqlite должна быть доступна всем? тз, итз у тебя всем доступны? Ну и тут тоже так.
Кроме того с sqlite вообще не рекомендуется работать по сетке, это все таки локальная база данных. Ну разве что через OLE DB.
Просадка скорости при работе с файлом будет достаточно большая. И придется слегка пошаманить: https://stackoverflow.com/questions/1711631/improve-insert-per-second-performance-of-sqlite Иначе будет очень грустно.
Зато гарантированно не упадет (если из 10гиговово файла в тз не делать запрос).
В памяти, кстати, типизированная база sqlite должна занять меньше места чем тз и тем более итз, но без ухищрений (дедупликации) видимо больше чем valtable.
Упирается в предел памяти, больше ограничений нет.

P.S. Когда-то рисовал класс-обертку для sqlite, аналог итз. Потом подучил sql и понял что это мне не нужно ;)
P.P.S. Надо бы нарисовать для sqlite guard-dog по памяти, а то вылетает так же как valtable.
 
 Рекламное место пустует
   Franchiser
 
167 - 07.08.19 - 18:10
(159) 8ка сырая, вот интересно что ты будешь делать с сентября в восьмерке с лицензией проф.
   Franchiser
 
168 - 07.08.19 - 18:11
(157) с чего ты это взял?
   Franchiser
 
169 - 07.08.19 - 18:12
(161) да я в основном на восьмерке работаю, на семёрке есть несколько баз. Перевод на восьмёрку их не согласован.
   Franchiser
 
170 - 07.08.19 - 18:15
(165) нет ole db без текстовых файлов.
Я понимаю что ты хочешь сказать, но я уже все на ИТЗ переписал, пока достаточно.
Я не могу вечно этой задачей заниматься сроки подходят к концу.
   Сияющий в темноте
 
171 - 07.08.19 - 18:59
может это,рассказать про Vlmфункции или Numa?
очень спасает тех,кто хочеи в 32 бита получить все 32 гига памяти.
но,опять же,влезет ли вся база оракла в память?а тут явно ее туда хотят засунуть.
   Franchiser
 
172 - 07.08.19 - 19:59
(171) не надо
   Franchiser
 
173 - 07.08.19 - 20:08
Если на то пошло, я мог бы в temp db SQL запихать
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.