Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос + ИндексированнаяТаблица Error! Cannot allocate memory block
,
0 Dolly_EV
 
10.10.12
16:00
после "ПрямогоЗапроса" есть две ИТЗ
1. 12312 строк, 7 колонок
2. 216938 строк, 26 колонок
при их "Объединить" вылазит "Error! Cannot allocate memory block"

Вопросы:
1. можно как-то обойти не уменьшая объем данных?
2. какие физ. ограничения для ИТЗ? (в Мб или строках/колонках или мемориблоках?)
3. это Индексированная таблица: ошибка читал.

П.С. база SQL 26Гб
1 Mikeware
 
10.10.12
16:07
Выбирай нужные данные. сомневаюсь, что тебе нужно столько данных
2 МихаилМ
 
10.10.12
16:07
1)/3GB

2) выгрузить в скл и обеъдинить

3) разделить тз на  блоки   обеъдинить , соединить
3 Dolly_EV
 
10.10.12
16:13
(2) "2) выгрузить в скл и обеъдинить" - типа так:
   ТекстЗапроса = "
   |INSERT INTO Топ"+ПериодСтрокой+" VALUES (@Пр7,@ВидПроизводителяИмпортера,@ПроизводительИмпортер,@ПроизводительИмпортерИНН,@НачОст,@КонОст
   |,@ПрихПр,@ПрихОп,@ПрихИм,@ПрихВо,@ПрихРо,@РасхОп,@РасхЭк,@РасхРо,@РасхВо,@РасхПр,@Док,@Прих,@Расх,@Импорт
   |)";
? я до инсерта еще не дошел в освоении ПЗ :-(
4 Dolly_EV
 
10.10.12
16:26
(2) 1)/3GB - по таскманагеру процесс 1С отжирает <1,5Гб в момент тяжелой операции
5 МихаилМ
 
10.10.12
16:29
(4)
ошибка невозможности получить блок памяти требуемого размера.
/3GB вероятность увеличит.
6 Dolly_EV
 
10.10.12
17:26
(2) "3) разделить тз на  блоки   обеъдинить , соединить"
Как? "разделить тз на блоки"
7 МихаилМ
 
10.10.12
18:11
(6 )
разделить 1 тз на   блоки

на блоки по N строк

N определите эмпирически, методом вилки.
8 Dolly_EV
 
10.10.12
18:30
(7) технически как сделать???
9 Dolly_EV
 
10.10.12
18:31
(7) эмпирически определил ))) - достаточно пополам попилить будет
10 H A D G E H O G s
 
10.10.12
19:12
Зачем тебе индексированная? Алкоголики некуда не спешат.
11 Dolly_EV
 
10.10.12
19:20
(10) Ну как не спешат? передышка на день)))
12 H A D G E H O G s
 
10.10.12
19:26
Расшифруй
13 H A D G E H O G s
 
10.10.12
19:27
Что за передышка?
14 Dolly_EV
 
10.10.12
19:32
(13) с форум.фсрар: "В настоящее время есть определенные проблемы с функционированием сервиса приема деклараций, ведутся работы по решению проблемы. Срок подачи копий деклараций 11 октября просьба сохранять терпение. 11 октября декларации будут обрабатываться с датой обработки 10 октября."
15 ЧеловекДуши
 
10.10.12
19:33
пф... П.С. база SQL 26Гб, это маленькая :)
Только 6 Гб, это первоначальный размер сиквельной БД
...
У нас 40 гб и нет такой проблемы...
Строй отчет по старинке...
16 Dolly_EV
 
10.10.12
19:36
15 "Строй отчет по старинке..." нииии, ждать по 2 часа на каждый квартал - хватит. Да в принципе урезал выборку (на две разделил) - дальше дело пошло. Хотя первоначальный вариант удобнее был
17 ЧеловекДуши
 
10.10.12
19:40
(16)Квартал и уже 2 гб только для ТЗ?
Вы батенько походу тяните мертвые дынные, т.е. избыточные :)
18 ЧеловекДуши
 
10.10.12
19:40
+ А что будет когда вы еще и на печать выведите?
19 Dolly_EV
 
10.10.12
19:43
(17) без Перемещений СтрГрупп="индОбщий:*ВидАП,*Склад,*Номенклатура,Емк,*ПроизвИмп,*ТекДок"; за квартал 200 000 строк
(18) на печать я это не буду выводить)))
20 КонецЦикла
 
11.10.12
01:18
Все можно сформировать и объединить на сервере, запросами то есть
Таскать для обработки ИТЗ такого объема - ...
21 Mikeware
 
11.10.12
07:31
(3)
select
...
into
22 varelchik
 
11.10.12
08:58
А что мешает выгрузить во временные таблицы в SQL?
ВыполнитьSQLИзТЗ()
23 Mikeware
 
11.10.12
08:59
(22) а зачем тянуть их вообще на клиента?
24 Dolly_EV
 
11.10.12
09:17
(22)(23) Да тяжко мне пока оперировать данными только на сервере, знаний не хватает :-(
25 Dolly_EV
 
11.10.12
09:17
+(24) но деваться некуда, так что разбираюсь с инсертом ))
26 Mikeware
 
11.10.12
09:53
(25) Инсерт тебе не нужен.
тебе достаточно ключевого слова INTO
27 МихаилМ
 
11.10.12
10:02
(26)
а как же индекс создастся ?
28 Mikeware
 
11.10.12
10:05
(27) А он ему нужен?
Впрочем, индекс можно и добавить...
29 Dolly_EV
 
11.10.12
10:09
(26) угу, я это еще через Класс "ПрямойЗапрос" делаю, баз sql/dbf поровну... только щас нашел в описании, что есть "•    Третий метод, который заполняет таблицу сразу большим количеством записей, - это вставка результирующего набора инструкции ВЫБРАТЬ."
30 Dolly_EV
 
26.10.12
10:29
Научился пользовать временные таблицы. Сбор данных теперь - моментальный. Остался один вопрос: можно ли еще ускорить вывод в файл xml.
Вот такой код:
           ПН0=0;
           Сообщить("XML "+п_Ном+": ПОДРАЗДЕЛЕНИЕ: "+тзПриложение.Подр,"iii");
           тзВидАП=тзПриложение.тзПотомки;
           тзВидАП.Сортировать("КодАП");
           тзВидАП.ВыбратьСтроки();
           Пока тзВидАП.ПолучитьСтроку()=1 Цикл
               Сообщить("    = XML "+п_Ном+":     ==ВидАП: "+тзВидАП.ВидАП,"i");
               ПН0=ПН0+1;
               хмлОборот = хмлОбъемОборота.appendChild(ХМЛФайлДанных.createElement("Оборот"));    
               хмлОборот.setAttribute("ПN",ПН0);
               хмлОборот.setAttribute("П000000000003",СокрЛП(тзВидАП.КодАП));
               
               ПЗапрос.ПодставлятьПараметры("Подр",тзПриложение.Подр);
               ПЗапрос.ПодставлятьПараметры("ВидАП",тзВидАП.ВидАП);
               
               тзТекПроизвИмп=ПЗапрос.ВыполнитьПараметризованныйЗапрос("ИндексированнаяТаблица");
               тзТекПроизвИмп.Группировать("индПроизвИмп:*ПроизвИмп;Контрагент:*Контрагент;ЛицКонтр:*ЛицКонтр;ТекДок:*ТекДок",СтрСумм,1);
               тзТекПроизвИмп.Сортировать("ПроизвИмп");
               тзТекПроизвИмп.ВыбратьСтроки();
               ПН1=0;
               Пока тзТекПроизвИмп.ПолучитьСтроку()=1 Цикл
                   //Сообщить("        ==ПроизвИмп: "+тзТекПроизвИмп.ПроизвИмп);
                   ПН1=ПН1+1;
                   хмлСведПроизвИмпорт = хмлОборот.appendChild(ХМЛФайлДанных.createElement("СведПроизвИмпорт"));    
                   хмлСведПроизвИмпорт.setAttribute("ПN",ПН1);
                   хмлСведПроизвИмпорт.setAttribute("ИдПроизвИмп",лВернутьИД("1",тзТекПроизвИмп.ПроизвИмп));
                   
                   тзТекКонтр=тзТекПроизвИмп.тзПотомки;
                   тзТекКонтр.Сортировать("Контрагент");
                   тзТекКонтр.ВыбратьСтроки();
                   ПН2=0;
                   Пока тзТекКонтр.ПолучитьСтроку()=1 Цикл
                       //Сообщить("            ==Контрагент: "+тзТекКонтр.Контрагент);
                       ПН2=ПН2+1;
                       хмлКонтрагент = хмлСведПроизвИмпорт.appendChild(ХМЛФайлДанных.createElement(лПолучательПоставщик));
                       хмлКонтрагент.setAttribute("ПN",ПН2);
                       хмлКонтрагент.setAttribute(лИДПолучателяПоставщика,лВернутьИД("2",тзТекКонтр.Контрагент));
                       
                       тзТекЛицКонтр=тзТекКонтр.тзПотомки;
                       тзТекЛицКонтр.ВыбратьСтроки();
                       Пока тзТекЛицКонтр.ПолучитьСтроку()=1 Цикл
                           //Сообщить("             ==Лицензия: "+тзТекЛицКонтр.ЛицКонтр);
                           Если ПустоеЗначение(тзТекЛицКонтр.ЛицКонтр)=0 Тогда
                               хмлКонтрагент.setAttribute("ИдЛицензии",лВернутьИД("3",тзТекЛицКонтр.ЛицКонтр));
                           КонецЕсли;
                           тзДок=тзТекЛицКонтр.тзПотомки;
                           тзДок.Сортировать("ТекДок");
                           тзДок.ВыбратьСтроки();
                           Пока тзДок.ПолучитьСтроку()=1 Цикл
                               //Сообщить("                ==Док: "+тзДок.ТекДок+", П15: "+тзДок.П15+", П16: "+тзДок.П16+", П20: "+тзДок.П20);
                               Док = тзДок.ТекДок;
                               Если п_Ном=6 Тогда
                                   Если тзДок.П20>0 Тогда
                                       хмлПоставкаЗакупка = хмлКонтрагент.appendChild(ХМЛФайлДанных.createElement("Возврат"));
                                       лПоказатель=тзДок.П20;
                                   Иначе
                                       хмлПоставкаЗакупка = хмлКонтрагент.appendChild(ХМЛФайлДанных.createElement(лПоставкаЗакупка));
                                       лПоказатель=тзДок.П15+тзДок.П16;
                                   КонецЕсли;    
                                   хмлПоставкаЗакупка.setAttribute("П000000000018",Формат(Док.ДатаДок,"ДДДММГГГГ"));
                                   хмлПоставкаЗакупка.setAttribute("П000000000019",Док.НомерДок);
                               Иначе
                                   //лВидДок=Док.Вид();
                                   НомВх="";
                                   ДатВх="";
                                   Если тзДок.П11>0 Тогда //лВидДок="ВозвратОтПокупателя"
                                       хмлПоставкаЗакупка = хмлКонтрагент.appendChild(ХМЛФайлДанных.createElement("Возврат"));
                                       лПоказатель=тзДок.П11;
                                       ДатВх=Док.ДатаДок;
                                       НомВх=СокрЛП(Док.НомерДок);
                                   Иначе
                                       хмлПоставкаЗакупка = хмлКонтрагент.appendChild(ХМЛФайлДанных.createElement(лПоставкаЗакупка));
                                       лПоказатель=тзДок.П7+тзДок.П8;
                                       ДатВх=Док.ДатаДокВходящий;
                                       ДатВх=?(Число(ДатВх)=0,Док.ДатаДок,ДатВх);
                                       НомВх=СокрП(Док.НомерДокВходящий);
                                       НомВх=?(ПустаяСтрока(НомВх)=1,СокрЛП(Док.НомерДок),НомВх);
                                   КонецЕсли;
                                   хмлПоставкаЗакупка.setAttribute("П000000000018",Формат(ДатВх,"ДДДММГГГГ"));
                                   хмлПоставкаЗакупка.setAttribute("П000000000019",НомВх);
                               КонецЕсли;
                               хмлПоставкаЗакупка.setAttribute("П000000000020","");
                               хмлПоставкаЗакупка.setAttribute("П000000000021",СокрЛП(Формат(лПоказатель,"Ч15.5")));
                           КонецЦикла;
                           тзДок="";
                       КонецЦикла;
                       тзТекЛицКонтр="";
                   КонецЦикла;
                   тзТекКонтр="";
               КонецЦикла;
               тзТекПроизвИмп="";
           КонецЦикла;
           тзВидАП="";
       КонецЦикла;
       тзПриложение="";
   КонецЕсли;


Если Параметризованный запрос тянуть выше (оставить на верху только группировку по подразделениям) - есть шанс напороться на ограничение памяти по ИТЗ. Если ниже - медленнее. В таком виде файл D6... xml размером 12 Мб выводится 10 минут.
"Алкоголики" - у кого как? И как ускорить? на фоне сбора данных за секунды - вывод 10 минут, как бы медленно))
31 Ёпрст
 
26.10.12
10:37
xml >80 метров.. и ничего
32 Ёпрст
 
26.10.12
10:37
ну и формирование никак не 10 минут - быстрее
33 Dolly_EV
 
26.10.12
10:40
(32)  Ёпрст4, твой код в основе.. что не так тогда??? при формировании Запрос моментально отрабатывает..все время уходит на перебор таблиц и на appendChild / setAttribute
34 Ёпрст
 
26.10.12
10:42
я переписал всё.
35 Ёпрст
 
26.10.12
10:42
:)
36 Ёпрст
 
26.10.12
10:42
+ ssd рулит
37 Ёпрст
 
26.10.12
10:44
можно еще ускорить - отказом от domdocument и рисованием xml ручонками через fso, мне лень ужо было.
38 Ёпрст
 
26.10.12
10:47
а так, раньше валилась на ИТЗ, пришлось кастрировать некоторые индексы и переделать мальца группировки
39 Dolly_EV
 
26.10.12
10:50
(34) дай посмотреть)))
(36) неужели настолько рулит? сервак без SSD но тоже вобщем не плохой
(37) это да, это у меня формат 4.01 так написан был, но дюже не удобно выводить, особенно при изменениях формата в дальнейшем

И это.. 80 Мб 6-ка - это за квартал?!?!?
40 Ёпрст
 
26.10.12
10:55
(39) да, за квартал, 6-ка
41 Ёпрст
 
26.10.12
10:55
это не много, есть и по 500 метров у некоторых..
42 Dolly_EV
 
26.10.12
11:07
(41) "это не много, есть и по 500 метров у некоторых.."
чего-то не складывается... 500/12 = в 41 раз больше, т.е. при прочих равных оборот должен быть в 41 раз больше, чем у нас. Это если на деньги перевести, получается оборот за квартал у такой конторы = ЗВР РФ.
Так что или у меня чего-то криво, или - в 500 метров пихается чего-то лишнее..
Хотя лишним в 6-ке могет быть только короткое или длинное имя контрагента.
43 Dolly_EV
 
26.10.12
11:09
(42) не, погорячился :-))) три нолика не хватает до ЗВР ))
44 Ёпрст
 
26.10.12
11:11
(42) ты просто мало знаком с сетями, например, с магнитом.
45 Dolly_EV
 
26.10.12
11:12
(44) угу, я поправился в (43)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn