Вход | Регистрация
    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
 
1 - 20.07.19 - 23:22
В обработке переменная модуля таблица значений
   Garykom
 
2 - 20.07.19 - 23:24
В стандартные ТЗ скорее всего нельзя.

Объясни зачем тебе столько данных в ТЗ?
   Franchiser
 
3 - 20.07.19 - 23:25
Ладно давай такой пример: есть 2 из в каждой по 300000, в этом случае тоже падает
   goodzone
 
4 - 20.07.19 - 23:26
Человек, напиши цель такого танца!
   Franchiser
 
5 - 20.07.19 - 23:27
Я помню раньше я мог использовать до 2 Гб оперативной памяти, а если пропатчить экзешник то до 3.5 Гб.
Но почему ТЗ не использует всю оперативную память  процесса до 1.5-2 Гб не понятно
   Franchiser
 
6 - 20.07.19 - 23:29
Есть обработка импорта документов из Oracle которая по непонятной причине вылетает и там оспользуется 2 большие из. Нужно оптимизировать. Нужно понять можно ли решить вопрос экстенсивным путем.
   Franchiser
 
7 - 20.07.19 - 23:31
В этой обработке выполняется много запросов к Oracle и порциями складываются результаты в ТЗ, но в промежутках тз не уничтожаются а удаляются строки, при этом оперативная память не высвобождается.
   goodzone
 
8 - 20.07.19 - 23:51
Не понятно, зачем складывать в ТЗ? Не лучше ли сразу выполнять требуемые действия и обработку полученного значения строки?!
   H A D G E H O G s
 
9 - 20.07.19 - 23:53
Строки удаляются не копированием в новую таблицу?
   H A D G E H O G s
 
10 - 20.07.19 - 23:54
В колонках есть строковые значения?

Просто, вы могли подойти к тому моменту, когда у процесса нет непрерывного куска памяти, который можно выделить под строку
   Franchiser
 
11 - 20.07.19 - 23:58
(8) ну такой алгоритм: запрос 1 складывает результат в тз шапок, другой запрос в тз строк. А потом создаются документы.
   Franchiser
 
12 - 20.07.19 - 23:59
(9) нет просто методом удалитьстроки().
   Franchiser
 
13 - 21.07.19 - 00:00
(10) да 30 колонок и значения складываются разные, при этом не все колонки типизированные
   goodzone
 
14 - 21.07.19 - 00:02
(11) 1. Получить шапки, 2. начать их обход, 3. для очередной строки шапки получить строки, 4.сформировать документ.
Не нужно создавать ТЗ, не нужно захламлять память.
   goodzone
 
15 - 21.07.19 - 00:04
Чем из оракла данные получаете?
   Franchiser
 
16 - 21.07.19 - 00:07
(14) запросов более 300 шт, поэтому менять алгоритм не планирую
   Franchiser
 
17 - 21.07.19 - 00:08
(14) шапки и строки сейчас в разных запросах
   Franchiser
 
18 - 21.07.19 - 00:12
(15) драйвер ole db
   Garykom
 
19 - 21.07.19 - 00:21
Имхо я бы вынес этот функционал из 1С 77 наружу во что угодно и в 1С только готовые данные передавал или наоборот из 1С их брал.

Ну устарела семерка, намного лучшие технологии.
   Garykom
 
20 - 21.07.19 - 00:21
(19)+ есть намного лучшие
   Franchiser
 
21 - 21.07.19 - 00:22
(19) у меня вопрос не как правильно, а как быстро исправить эту ошибку без последствий.
   Franchiser
 
22 - 21.07.19 - 00:23
(19) какие технологии?
   Franchiser
 
23 - 21.07.19 - 00:25
(19) xml, web сервисы?
   H A D G E H O G s
 
24 - 21.07.19 - 00:32
Пеши в файл
   Franchiser
 
25 - 21.07.19 - 00:38
Объединять запросы не хочу
   v77
 
26 - 21.07.19 - 09:37
а может это не ТЗ сжирает память, а 300 запросов? может запросы тоже надо удалять?
   v77
 
27 - 21.07.19 - 09:39
а так вабще (24)
но в семерке я чота не помню, есть ли возможность дописывать в файл
   Туц
 
28 - 21.07.19 - 09:42
(0) Никак. И это около нормы. Ищи иной вариант реализации задачи.
   Туц
 
29 - 21.07.19 - 09:47
Как вариант собирай данные в MSSQL и в нём обрабатывай.
   Salimbek
 
30 - 21.07.19 - 10:49
(29) Нафиг к одному монстру приплетать другого монстра?
(22) Варианты:
1) Временная таблица на стороне Оракла - и запросами прямо в SQL перекидываешь нужные данные с рабочих таблиц в эту внутреннюю. Как соберешь то, что в итоге нужно, так вытаскиваешь в 1С
2) Вместо временной таблицы Оракла используешь 1SQLite, создаешь файл-бд SQLite, далее все как в п. 1)
 
 Рекламное место пустует
   Cthulhu
 
31 - 21.07.19 - 11:03
1) попробуй удалять строки методом "КоличествоСтрок"
2) попробуй сливать-доливать-грузить-писать документы по-файлово (или порциями) с xbase (с индексами, по аналогии со структурой dh-dt ефьлиц документов). вынос в отдельные процедуры основных функций на уровне документов (и, возможно, строк) поможет уменьшить количество правок кода.
   АгентБезопаснойНацио
 
32 - 21.07.19 - 11:03
+(30) Или, если уж очень лениво, вместо ТЗ писать в dbf, индексировать - и будет не сильно медленней ТЗ
   Туц
 
33 - 21.07.19 - 11:16
(30) Тебе памяти не хватает, что-то придется делать. У тебя всего 1Гиг. Если речь о скорости не идёт ставь хоть express и в добрый путь. Опять же в Оракле обработай, чем в ТЗ итерации гонять.
   Злопчинский
 
34 - 21.07.19 - 11:20
Попробуй индексированную ТЗ из 1с++
И вообще переделать логику
   vcv
 
35 - 21.07.19 - 14:44
(34) С ИТЗ попроще, но всё равно не спасает от ошибки нехватки памяти. Только немного на больших объёмах возникает.
   Franchiser
 
36 - 21.07.19 - 16:24
(34) в плане памяти нет разницы из или итз, уже пробовал
   Franchiser
 
37 - 21.07.19 - 16:25
(31) что за удаление методом КоличествоСтрок?
   Franchiser
 
38 - 21.07.19 - 16:26
Я планирую время от времени просто уничтожать ТЗ в этом случае память высвобождается.
   Franchiser
 
39 - 21.07.19 - 16:27
(30) нет доступа к временным таблицам в оракул и давать не планируют
   ДенисЧ
 
40 - 21.07.19 - 16:33
Если вылезла такая проблема, то очевидно, что для решения задачи выбран неправильный интструмент. Начинать нужно с этого. Мы же не забиваем ж/д-костыли молоточком для гравировки по золоту.
   Franchiser
 
41 - 21.07.19 - 16:37
Обработке 20 лет, понятно что если не прокатит вариант с уничтожением тз буду придумывать что то иное: SQL lite , временные таб в SQL и ТД.
За вариант с sqllite спасибо, нужно поизучать.
   Franchiser
 
42 - 21.07.19 - 16:39
Обработка огромная импортирует несколько десятков видов документов и ещё они разбиты на подвиды. Поэтому так много запросов.
   ДенисЧ
 
43 - 21.07.19 - 16:43
(41) 20 лет назад у тебя было 10 документов, сейчас 20 миллионов.
20 лет ты на велосипеде ездил, а сейчас и на самолёте не долетишь...
   Franchiser
 
44 - 21.07.19 - 16:45
Просто со временем выросло количество колонок в этих ТЗ
   Franchiser
 
45 - 21.07.19 - 16:45
Где посмотреть примеры скидывания тз в SQL lite и поиск данных в ней?
   Garykom
 
46 - 21.07.19 - 16:55
(45) Ты понимаешь что вместо молоточка хочешь взять кувалду?
Нахрена когда давно есть сваезабивалки причем с ИИ?

У тебя оракловская база, ну так ставишь https://ru.wikipedia.org/wiki/PL/SQL_Developer и учишь https://ru.wikipedia.org/wiki/PL/SQL
   Garykom
 
47 - 21.07.19 - 16:58
Или взять 1С 8.3 последних версий, подрубить туда базу оракла как http://v8.1c.ru/overview/Term_000000795.htm и вперед
   Garykom
 
48 - 21.07.19 - 17:01
(46)+ Можно бесплатный https://ru.wikipedia.org/wiki/Oracle_SQL_Developer взять для начала
   mishaPH
 
Модератор
49 - 21.07.19 - 17:07
(45) я в таких случаях использую постгри.
банальный insert и select. Можно индексов на поля поставить для упрощения поиска.
НО индексы уменьшают скорость ins.
   Franchiser
 
50 - 21.07.19 - 17:13
(47) запросы в восьмерке падают к организации через внешние источники. Писать в 1с ответа так и нет. Пришлось переписывать все на ole db. Проблема была в таймауте, но никакими способами установит тайм-аут во внешних источниках не получилось.
   Franchiser
 
51 - 21.07.19 - 17:15
(46) что учить то. CTE работает, временные таблицы нет. Опять же не хочу переписывать все алгоритмы.
   H A D G E H O G s
 
52 - 21.07.19 - 17:20
(50) Да ладно
ПараметрыСоединенияВнешнегоИсточникаДанных (ExternalDataSourceConnectionParameters)
СтрокаСоединения (ConnectionString)
Использование:
Чтение и запись.
Описание:
Тип: Строка, Неопределено.
Содержит строку соединения ко внешнему источнику данных.

В строке
Connection Timeout=300
   Franchiser
 
53 - 21.07.19 - 18:48
(52) timeout есть у connection и у adodb.command.
Как у второго поставить?
   Злопчинский
 
54 - 21.07.19 - 18:50
ну еще и удаление строк из ТЗ меня несколько напрягает. операция это наверное ресурсовемкая и приводит к фрагментации памяти. еще и если реквизиты в ТЗ явно не типизированы.
   ДенисЧ
 
55 - 21.07.19 - 18:56
(54) "операция это наверное ресурсовемкая и приводит к фрагментации памяти"

Ну ты этта... таво... Перестань материться... ))))
   Провинциальный 1сник
 
56 - 21.07.19 - 18:57
(0) А попробуйте следующее:
1. Типизировать строки как строку
2. Хранить объектные данные в виде сериализованных ЗначениеВСтрокуВнутр()

Просто интересно, насколько это будет отличаться по расходу памяти
   ДенисЧ
 
57 - 21.07.19 - 18:58
   Злопчинский
 
58 - 21.07.19 - 19:00
(56) а какая разница? объект в ТЗ хранится в виде ссылки.
   Провинциальный 1сник
 
59 - 21.07.19 - 19:01
(32) "вместо ТЗ писать в dbf, индексировать - и будет не сильно медленней ТЗ"
Если индексировать - то будет БЫСТРЕЕ, чем ТЗ с тупым поиском. Сталкивался с этой фигней для хранения большого кэша, когда еще не знал про 1с++ и индексированную таблицу. Если искать непосредственно в ТЗ - тормозит. Если ключи поиска хранить в индексированном xbase (сериализованное значение ключа, номер строки ТЗ) - то искать намного быстрее получается.
   Franchiser
 
60 - 21.07.19 - 20:24
(57) как это связана с методами внешних источников 1с8?
   Franchiser
 
61 - 21.07.19 - 20:26
(59) sqlite не быстрее будет?
   Franchiser
 
62 - 21.07.19 - 21:10
(59) у dbf тоже ведь ограничения: файл не больше 2 гб?
Тогда уж лучше писать большие строки в список значений, там можно примерно 1.8 гб процесса 1с 7.7 съесть.
   Franchiser
 
63 - 21.07.19 - 21:22
Проверил: замена ТЗ на ИТЗ позволяет в 1.5 раза больше строк впихнуть, при это 1ска не вываливается и ошибка может быть обработана в коде
   Salimbek
 
64 - 21.07.19 - 22:43
(41) А чего там смотреть то?
    ЗагрузитьВнешнююКомпоненту(путь+"1sqlite.dll");
    бд = СоздатьОбъект("SQLiteBase");
    бд.Открыть(путь+"bd.sbd");
и далее
    ТекстЗапроса = "insert into Kontr (id, kodmag)
            |    select id, kodmag from _tmp
            |";
    рс.ВыполнитьЗапрос(ТекстЗапроса);
    рс.ВыполнитьЗапрос("update Tovar set ean    =substr(ean,2);");
   Garykom
 
65 - 21.07.19 - 22:52
(64) Все тоже самое можно делать с табличками в оракле, не заморачиваясь отдельной базой.
Самое оптимальное это все что можно сделать на pl/sql а затем только результат в 1С.
Если результата слишком много то кусками его.
   МихаилМ
 
66 - 22.07.19 - 01:30
при использовании /3G

в тз помещалось 900к записей

в итз 2500к. колво колонок не меньше 20.
 
 Рекламное место пустует
   Franchiser
 
67 - 22.07.19 - 02:29
(64) понятно, ну нужно посмотреть как индексировать, удалять, join делать и ТД.
Там ещё вроде сначала журналирование нужно отключать. Нужно устанавливать ещё какие то программы для sqlite кроме внешней компоненты ?
   Franchiser
 
68 - 22.07.19 - 02:30
(66) /3g это патч exe или что другое ?
   Franchiser
 
69 - 22.07.19 - 02:38
(66) речь об этой команде?
BCDEdit /set increaseuserva 3072
   МихаилМ
 
70 - 22.07.19 - 02:44
(68) параметр для выделения памяти 3,5 гиг озу. подробностей не помню .было более 10 лет назад
   Franchiser
 
71 - 22.07.19 - 03:34
Для Windows XP \ Windows 2003 в файле boot.ini указываем:
/3GB /userva=xxxx (xxxx в МБ в диапазоне 2048 - 3072), рекомендуемый максимум значений userva 2900–3030.
   Провинциальный 1сник
 
72 - 22.07.19 - 07:47
(71) Если 20003 64-битный, то смысла в /3Gb нет никакого, там "/4Gb" изначально. Другое дело, что приложение должно быть скомпилировано с опцией использования более 2 гигабайт в аллокаторе памяти. Не в курсе, как с этим у 7.7, но вот 32-битная восьмерка точно умеет использовать всё адресное пространство процесса.
   Провинциальный 1сник
 
73 - 22.07.19 - 07:49
(62) 2 гигабайта - это немало. Тем более, можно же хранить данные в нескольких файлах, с нормализацией "до упора", чтобы в каждом файле хранилась пара "ключ-значение".
   Djelf
 
74 - 22.07.19 - 08:46
(68) Что-то другое.
Нужно на exe установить флаг LARGE_ADDRESS_AWARE, ну вот этим например https://ntcore.com/?page_id=371
И 7ка сможет около 3.7 гигов использовать на х64 или на х32 с флагами из (71)
   Djelf
 
75 - 22.07.19 - 08:52
Если использовать sqlite как временное хранилище, возможно потребуется указывать прагму temp_store file https://www.sqlite.org/pragma.html#pragma_temp_store потому что по-умолчанию, ВК для 7ки скомпилирована с temp_store в оперативке.
   Franchiser
 
76 - 22.07.19 - 10:53
(74) в статье пишут что это нужно делать на x32 только системе .
   Franchiser
 
77 - 22.07.19 - 10:57
(75) а если указать :memo: ?
   Djelf
 
78 - 22.07.19 - 14:16
(76) Врут! Ну не совсем врут, если флаг установлен то приложение будет использовать 4гб, а если не установлен то все равно 2.
Почитай у Русиновича насчет LARGE_ADDRESS_AWARE http://programming-lang.com/ru/computers/russinovich/3/j2.html

(77) С sqlite возможно работать как с файлом так и с базой в памяти.
Отдельно, можно указать что временные таблицы тоже находятся в памяти или в файле.
Обычно, указывать расположение временных таблиц в файле не требуется. Такое случается довольно редко.
Если у тебя объем больше 2х гигов то базу однозначно держать в файле, а вот нужно ли переносить временные таблицы в файлы узнаешь по ходу дела.
Тебе видимо нужно примерно так делать:
Открываешь сразу две базы!!! Одну в памяти, а вторую уже как файл.
 База.Открыть(":memory:");
 База.НовыйЗапрос().ВыполнитьЗапрос("ATTACH DATABASE '"+ФайлБазы+"' AS '"+ИмяСхемы+"';",0);
Дальше периодически укладываем таблицы в базу в памяти
 База.УложитьТЗ(ТЗ, ИмяТаблицыВПамяти, [КакПостоянную])
И перекидываем из памяти в Файл, в транзакции
 База.НовыйЗапрос().ВыполнитьЗапрос("BEGIN")
 База.НовыйЗапрос().ВыполнитьЗапрос("INSERT INTO ИмяСхемы.ИмяТаблицыВФайле (ПОЛЯ) FROM (SELECT ПОЛЯ FROM ИмяТаблицыВПамяти)
 База.НовыйЗапрос().ВыполнитьЗапрос("COMMIT")

Вот тут может быть засада, данные одновременно и в ТЗ и в базе sqlite в памяти.
Если будет переполнение памяти, придется укладывать временную таблицу в файл, а это значительно медленнее.
   Franchiser
 
79 - 22.07.19 - 14:37
(78) не понял на x64 нужно дополнительно вносить строку в boot.ini.
Экзешник пропатчен но все равно больше 2гб не расходует
   Franchiser
 
80 - 22.07.19 - 14:53
Получилось: скоппировал каталог семерки и заново пропатчил объем памяти используется больше 2 гб
   Franchiser
 
81 - 22.07.19 - 15:18
Заметил такую особенность: при пропатченном файле можно одинаково добавить по 2 млн строк в ТЗ из 20 колонок, но при этом ИТЗ расходует на 1 гб больше памяти чем ТЗ.
Т.е. при использовании ТЗ примерно доходит до 2.5 ГБ; При ИТЗ до 3.5 гб.
   Franchiser
 
82 - 22.07.19 - 15:23
При этом сравнивал Типизированную ТЗ с ИТЗ.
Если не типизировать ТЗ, то ИТЗ выигрывает в 2 раза.
Есть ли возможность типизировать колонки ИТЗ?
   Salimbek
 
83 - 22.07.19 - 15:51
(82) На сколько я помню, там совсем другой механизм хранения данных в ИТЗ и типизация там не играет роли.
(81) Индексы в ИТЗ не используешь?
   Franchiser
 
84 - 22.07.19 - 18:58
(83) нет пока без индексов
   ADirks
 
85 - 23.07.19 - 13:35
(82) В ИТ колонки не типизируются. Вследствие чего она гарантировано жрёт больше, чем ТЗ с типизацией.
А вот утверждение "Если не типизировать ТЗ, то ИТЗ выигрывает в 2 раза" - весьма странно. Должно отжираться примерно одинаково.
   Провинциальный 1сник
 
86 - 24.07.19 - 18:13
(79)  "не понял на x64 нужно дополнительно вносить строку в boot.ini. "
Не нужно.
"Экзешник пропатчен но все равно больше 2гб не расходует"
Значит, экзешник "недостаточно пропатчен", и есть методы работы с памятью в коде, которые упираются в 2 гигабайта независимо от опции экзешника.
   Franchiser
 
87 - 24.07.19 - 18:46
(86) не уже заработало:
На ИТЗ вылится при памяти 3.5 Гб
На ТЗ на 2.5 Гб
   Djelf
 
88 - 24.07.19 - 20:06
(87) слишком много, ограничения в запросах есть?
по дате хотя бы есть чтобы не запрашивать 2000й год?
ну если нет то цикл с ограничением по дате
   Chum
 
89 - 05.08.19 - 11:54
(0) Семёрка падает на диапазоне 500-600 тысяч строк.... (27-я платформа sql2008).

Сдается мне, что тебе не нужна такая большая таблица, или твой подход неверный.
Если используется sql, а выше уже упоминалась ИТЗ, то что тебе мешает переложить обработку таблиц непосредственно на sql? Создавай на сервере временные таблицы, скидывай туда все, что нужно, там же и обрабатывай данные, а на выходе передавай в свою семерку уже готовый результат.
Делать простой запрос, выгружать много-много строк и потом перебирать их средствами 1С - глупо.
1. sql отработает задачу несопоставимо быстрее, чем средствами 1с;
2. sql не жалуется на размер памяти, а еще там можно всякие хранимые процедуры писать;
3. из косвенных минусов придется использовать 1cpp.dll (кто-то этого не любит), но там столько плюшек.
   Botanik8888
 
90 - 05.08.19 - 12:28
(89) - так ИТЗ пробует, значит и 1cpp использует, а так самая действенная рекомендация, если нельзя весь мусор на стороне источника оставить.
   Злопчинский
 
91 - 05.08.19 - 13:39
(89) ну, это смотя где...
столкнулся с тем, сто скуль запрос с условием типа "Условие(Номенклатура в СЗ)" обрабатывало очень медленно.
горааааздо быстрее оказалось убрать условие и фильтровать при обходе результатов
   Chum
 
92 - 05.08.19 - 13:58
(91) это может и так, но при грамотном составлении текста прямого запроса, т.е. со всякими пересечениями таблиц, все отрабатывает моментально. Что мешает предварительно сделать запрос к номенклатуре вместо "Условие(Номенклатура в СЗ)"? Или подзапрос? Это сработает гораздо быстрее.
   АгентБезопаснойНацио
 
93 - 05.08.19 - 13:59
(91) Прямой запрос (с соединением или фильтрацией п овременной) тоже медленно отрабатывал?
   VladZ
 
94 - 05.08.19 - 14:08
(0) Для большого объема данных используй внешние БД.
   Arbuz
 
95 - 05.08.19 - 17:30
Если прям совсем руки не поднимаются на внешние БД или переписывание основной логики запросов, то есть ещё ValTable - по расходу памяти выигрывает в 2-5 раз у ТЗ, в зависимости от типа значений. у меня работало на таблицах чуть менее 2кк строк, 10 числовых полей и одно фикс строка*50 - около 500 метров рамы кушало.
   Arbuz
 
96 - 05.08.19 - 17:33
упс
*фикс строка*150
   Franchiser
 
97 - 05.08.19 - 17:54
(95) что то не могу найти компоненту ValTable, ссылки битые.
   Franchiser
 
98 - 05.08.19 - 18:48
Телепат  не видит методы ValTable, как ее зарегистрировать?
   Franchiser
 
99 - 05.08.19 - 18:59
intsOleGenerator.vbs может сгенрировать ints-ы под  addin?
   Franchiser
 
100 - 05.08.19 - 19:01
При запуске Regenerator пишет 
"По прог-ид addin.valtable не удалось получить главного интерфейса
Ошибка генерации файлов по прог-иду: addin.valtable"
  1  2   

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