Имя: Пароль:
1C
1С v8
Массив как лучше хранить в базе?
0 Garykom
 
гуру
28.01.16
11:39
Нужно сохранять в базе 2 больших числовых двумерных массива (до 1000х1000 целых положительных чисел).
Конфа УТ10.3.

Где и как оптимальнее его хранить чтобы потом получать быстро?

Кроме массивов еще нужно хранить пронумерованный список складов, связанный с этими массивами.
Куда его лучше сохранить?

Массивы можно засунуть в ХранилищеЗначения, но список туда нежелательно так как ссылки на справочник складов.
34 Масянька
 
28.01.16
13:13
(32) Каждый склад везде участвует?
35 Garykom
 
гуру
28.01.16
13:14
(34) если есть маршруты, склад может участвовать от 0 до 7 раз
36 Garykom
 
гуру
28.01.16
13:15
(35)+ чтобы массивы были поменьше полное умножение не делаю, только смотря какие склады отправления и склады назначения

если Склад(Пн) нигде не учавствует то и вершины Склад(1) нет
37 Фрэнки
 
28.01.16
13:16
(33) Если число полей в одну запись регистра сведений можно поставить фиксировано, то будет удобней в РС сделать.

Если бы было переменное количество значимых значений по строкам массива, то лучше в справочник с переменным числом строк в ТЧ каждого элемента.

А просто регистр на регистр для двумерности, но без ссылок на справочник не сделаешь.
38 Масянька
 
28.01.16
13:17
(36) Ну, куда ты лезешь - поперед батьки? :) Только хотела сказать...

Таблицу маршрутов покажи (как в (32)).
39 Garykom
 
гуру
28.01.16
13:18
(37) интересная идея, можно технически взять и массив поделить на число складов и их в ТЧ каждого склада

но не хочу таким извратом заниматься это сложность еще вырастает (потеря быстродействия) а из удобства только хранение в базе
40 Фрэнки
 
28.01.16
13:19
(36) тогда Я бы такое делал на справочнике с ТЧ
41 Garykom
 
гуру
28.01.16
13:19
(38) Не могу, оно платное ))
42 Garykom
 
гуру
28.01.16
13:21
(40) проблема что алгоритм (http://catalog.mista.ru/public/442306/) только с двумерными массивами работает
и так начальное преобразование проблеммное еще и усложнять?
43 Фрэнки
 
28.01.16
13:24
(40) о каком быстродействии речь, когда в начале обработки данных ты прочтешь все данные запросом в свою рабочую матрицу и все. А в самом конце, возможно, перезапишешь обратно.

Кстати, может оказаться, что числовые значения окажутся каждый раз только расчетными от изменившихся оперативных состояний складов, а не фиксируемыми. Фиксация, с потерей времени на запись, потребуется только для записи вершин (или узлов, как ты там их у себя называешь, не знаю)
44 Garykom
 
гуру
28.01.16
13:25
(43) что быстрее

запросом данные в Массив 1000х1000 (10 тысяч записей) прочитать из чего то?

или просто из хранилища восстановить?
45 Фрэнки
 
28.01.16
13:30
(44) наверное, могу ошибаться, хранилище значений умеет работать с полями произвольного размера.
Т.е. для этого объекта нужен доступ к чему-то в СУБД с блоб-полями, которые считываются сразу большими блоками. Затем уже в оперативной памяти разбираются как нужно.
46 Garykom
 
гуру
28.01.16
13:32
(45) Вот в этом собственно и вопрос :)

Может быстрее будет не массив в хранилище засовывать а каким то иным образом?
47 Фрэнки
 
28.01.16
13:33
(45) другое дело, что считывание происходит один раз в начале и для юзера будет не критично чтение 10 тысяч записей одним запросом или считывание такого же объема данных из хранилища.
48 Фрэнки
 
28.01.16
13:36
(46) такое у меня дежавю, что я где-то в какой-то типовой уже видел использование больших объемов данных именно через хранилище значений
49 Garykom
 
гуру
28.01.16
13:38
(47) вот из-за этого у нас с NS и вышел спор,
я утверждал что никакой теоретический алгоритм без напильника низзя напрямую в реальности использовать

если бы преобразовать эти 2 массива
(1-й по сути длина минимального пути между вершинами АхБ, берется как в таблице умножения, 2-й номер предыдущей вершины этого пути) в "готовые маршруты"

то их уже можно было бы как угодно хранить в базе и как угодно получать

но это преобразование для такой реальной (с учетом что периодичности маршрутов по времени) тучи складов-вершин слегка затратно
50 Garykom
 
гуру
28.01.16
13:38
(48) да тоже дежавю, но не на типовую а на ветку тут
51 Кирпич
 
28.01.16
15:08
Так сколько складов то в реальности?
52 Garykom
 
гуру
28.01.16
15:11
(51) тестовые данные 64 склада, 440 маршрутов
при умножении на 7(дней в неделе) выходит расчет для ~400 вершин с 440 ребрами
53 Кирпич
 
28.01.16
15:13
(52) и чо надо вычислить?
54 Serginio1
 
28.01.16
15:15
(44) Что то у тебя со счетом 1000х1000 будет мульён.
Прочитать из таблицы будет быстрее, но вот запись будет значительно дольше
55 Garykom
 
гуру
28.01.16
15:15
(52)+ код на 1С считает все минимальные по длине существующие маршруты примерно 5-10 минут, потом получение любого маршрута мгновенно

только осложняется что нужно брать 7 маршрутов и выбрать из них реальный ))
Допустим сегодня Чт, 4 день тогда считаем/ищем 7 маршрутов (по кол-ву возможных дней в неделе окончания):

1. Склад 1(4) - Склад 2(1)
2. Склад 1(4) - Склад 2(2)
...
7. Склад 1(4) - Склад 2(7)
56 Garykom
 
гуру
28.01.16
15:16
(54) Все работает, сча тестю с ХранилищемЗначения, если что то не так буду думать уже
57 Garykom
 
гуру
28.01.16
15:21
(54) блин и правда мульён... совсем старею уже в уме умножать разучился ((
58 Serginio1
 
28.01.16
18:14
(55) Ты конечно извращенец такие алгоритмы на 1С считать.
59 Garykom
 
гуру
28.01.16
18:22
(58) это не я извращенец ))

но если подскажете быстрый способ передачи таких данных из 1С куда то и назад буду благодарен и даже ВК наваяю
60 Serginio1
 
29.01.16
00:46
(59) Передавай  safeArray. В .Net он определится как массив.
61 Другая
 
29.01.16
01:17
(0) Жениться тебе надобно, и все пройдет.
62 VladZ
 
29.01.16
05:39
(0) Что это за инфа, которую нужно хранить в 1С?
63 VladZ
 
29.01.16
05:44
+62 Продолжу свою мысль.  Допустим, у нас есть некая совокупность данных с определенной структурой. Вспоминаем, как называется "совокупность данных, хранимых в соответствии со схемой данных..."...  База данных!!! :)  Вот и храни во внешней базе данных! Нужно подцепить к 1С - используй внешний источники.  Какой "пихать  н е в п и х у е м о е"?
64 VladZ
 
29.01.16
05:45
* опечатка: "Какой смысл..." далее по тексту
65 ЧеловекДуши
 
29.01.16
06:40
(0) В регистре, только в виде одномерного варианта :)
66 Garykom
 
гуру
29.01.16
10:46
(61) Кандидаток из Москвы пока не рассматриваю :)
67 Garykom
 
гуру
29.01.16
10:46
68 Garykom
 
гуру
29.01.16
10:48
(65) и в константе оно хорошо хранится точнее в 3-х константах разных

ЗЫ когда уже 1С придумает "группы для констант", а то только формы и наборы мало помогают
69 Serginio1
 
29.01.16
11:19
60+ Кстати десериализация массива очень быстра и компактна

var res = new int[20, 20];

            for (int i = 0; i < res.GetLength(0); i++)
                for (int j = 0; j < res.GetLength(1); j++)
                    res[i, j] = i + 20 + j;

            var stream = new MemoryStream();

            var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            bf.Serialize(stream, res);

            textBox.AppendText(stream.Length.ToString() + Environment.NewLine);

Общий размер байт 1638
20*20*4=1600 и плюс информация о размере массива типе еще 38 байт
70 Garykom
 
гуру
29.01.16
11:22
(69) а терь плиз повторить тест с 1000х1000 ))
71 Garykom
 
гуру
29.01.16
11:23
(70)+ и в 1С ))
72 Serginio1
 
29.01.16
11:24
(70) 4000038
73 Serginio1
 
29.01.16
11:26
71 Ну в 1С то есть COMSafeArray это и сам сможешь
74 Serginio1
 
29.01.16
11:28
60+ В Net COMSafeArray  сразу приводится к двумерному массиву. При передаче в 1С он будет как COMSafeArray
75 Garykom
 
гуру
29.01.16
11:46
(74) а в linux?
76 Serginio1
 
29.01.16
11:58
(75) В линкус можешь сереиализовать в CSV или JSON.
77 Garykom
 
гуру
29.01.16
12:02
(76) Да можно

Интересно ограничения на практике на длину передаваемых строковых параметров какие будут
78 Serginio1
 
29.01.16
12:07
Кстати ЗаписатьJSON(<ЗаписьJSON>, <Значение>, <НастройкиСериализации>, <ИмяФункцииПреобразования>, <МодульФункцииПреобразования>, <ДополнительныеПараметрыФункцииПреобразования>)
Параметры:

<ЗаписьJSON> (обязательный)

Тип: ЗаписьJSON.
Объект, через который осуществляется запись JSON. Поток JSON должен быть подготовлен для записи значения.
<Значение> (обязательный)

Тип: Произвольный.
Объект записи JSON. Меняет состояние потока записи.
Представляет собой значение произвольного типа.
В формате JSON допускается записывать только значения следующих типов:
Строка,
Число,
Булево,
Дата (преобразованная в строку),
Массив,
ФиксированныйМассив,
Структура,
ФиксированнаяСтруктура,
Соответствие,
ФиксированноеСоответствие.
Ключ соответствия (или фиксированного соответствия) должен иметь тип Строка. В противном случае, будет вызвано исключение.
Если будет передано значение, отличное от перечисленных, оно должно быть преобразвоано с помощью функции преобразования.
При попытке записать значение недопустимого типа будет вызвано исключение.
<НастройкиСериализации> (необязательный)
79 Serginio1
 
29.01.16
12:07
(77) Ограничение только на память
80 Serginio1
 
29.01.16
12:09
Двумерный массив по сути то одномерный
81 Serginio1
 
29.01.16
12:16
Или массив массивов
82 Кирпич
 
29.01.16
12:17
Бугага!!!
мои предсказания в (10) сбылись :)
83 Garykom
 
гуру
29.01.16
12:23
(82) http://www.anekdot.ru/id/674409/

хотя это http://www.anekdot.ru/id/-9946592/ мне больше нравится :)
84 rsv
 
29.01.16
12:26
(0) Сколько MS SQL Enterp дает полей в таблице по max ?
85 Serginio1
 
29.01.16
12:27
82 Ну нужно же направить на путь истинный. А то считать матрицы в 1С как то не кошерно. здесь лучше всего подходит С++ с SIMD вычислениями
86 rsv
 
29.01.16
12:29
+(84) т.е. 1000 строк на 1000 столбцов и ... select * from
87 Garykom
 
гуру
29.01.16
12:29
88 Кирпич
 
29.01.16
12:34
(85) да я бы проще сделал: сляпал бы по бырому ВК с алгоритмом Дейкстры. выгрузил бы таблицу с ребрами в текст. там будет меньше мегабайта. Расчет магшрута занимал бы полсекунды вместе с загрузкой таблицы. Два часа работы.
89 Serginio1
 
29.01.16
12:42
90 Serginio1
 
29.01.16
12:44
(88) Я алгоритм Дейкстры знаю, а вот в алгоритм Флойда Уоршелла не вникал.
А так полностью согласен.
91 Кирпич
 
29.01.16
12:48
(90) я и алгоритм Дейкстры не знаю, но могу скопипастить в интернете. :)
92 trad
 
29.01.16
12:48
(86) для хранения в sql двумерного массива нужна таблица только из 3 колонок:
Стр,Кол,Знач
первичный ключ (Стр,Кол) - для получения элемента и выборки строки массива
и доп индекс (Кол,Стр) - для получения выборки колонки массива
93 trad
 
29.01.16
12:50
(92)+ все это отлично ложится в регистр сведений
94 Serginio1
 
29.01.16
12:51
(91) Он очень понятный. А насчет (10) Поверь, я долго держался. Но считать такие вещи на 1С это извращение.
95 Кирпич
 
29.01.16
12:51
(92) спасибо тебе, что ты есть.
96 rsv
 
29.01.16
12:51
(92) Это вертикаль .(86) - горизонт
97 Serginio1
 
29.01.16
12:52
(94) Но я то предложил бинарную сериализацию в 69
98 trad
 
29.01.16
12:52
(95) звучит почти как: Слава тебе, Господи!
99 trad
 
29.01.16
12:53
(96) что? какая вертикаль? какой горизонт?
Стр,Кол,Знач - тут и вертикаль и горизонт
100 rsv
 
29.01.16
12:56
(99) Ну это .... прямая .
101 trad
 
29.01.16
12:57
(99)+ знать о макс количество колонок (Q) в таблице нужно только тогда, когда нужно организовать N-мерный массив, с N близким к Q
102 trad
 
29.01.16
12:59
(100)
Инд1,Знач - это линия
Инд1,Инд2,Знач - это плоскость, двумерный массив
Инд1,Инд2,Инд3,Знач - это куб
и т.д.
Инд1,..,ИндN,Знач - это N-мерный массив
103 rsv
 
29.01.16
13:00
(101) Скуль знает ...
104 ЧеловекДуши
 
29.01.16
13:00
(69) А вытягивать ты будешь, в циклах?
Я так то рассматривал вариант получение информации под средством запросов :)
105 ЧеловекДуши
 
29.01.16
13:02
(99) Зачем вообще знать количество колонок?
Кто сказал, что в таблица должна быть размера массива?
Какая СУБД такое может предоставить, когда Сегодня там 100, а завтра 10000 элементов?
Человек не сойдет с ума, внося 1000 колонок в одну таблицу? :)
106 ЧеловекДуши
 
29.01.16
13:03
+(105) К чему такое расточительное хранение информации? :)
107 Кирпич
 
29.01.16
13:04
(105) ладно вам. ну ляпнул человек неподумавши.
108 trad
 
29.01.16
13:05
(105) эти вопросы ко мне?
я не говорю про 1000 колонок в одной таблице
я говорю что двумерный массив размещается в трех колонка одной таблицы
109 Кирпич
 
29.01.16
13:06
+(107) хотя 1000 столбцов это додуматься надо :)
110 trad
 
29.01.16
13:33
(107) кто ляпнул не подумавши?
озвучь мой ляп
111 Garykom
 
гуру
29.01.16
13:36
(88) если бы

просто между складами ездиют не каждый день а по дням недели
день пропустили значит что?

или ищем обходной маршрут в тот же день или нужно ожидание в каком то складе
112 Кирпич
 
29.01.16
13:36
(110) да не ты
113 ЧеловекДуши
 
29.01.16
13:40
(108) Не, не вам, у вас так как должно быть :)
114 Кирпич
 
29.01.16
13:40
(111) и что это меняет? поставь в массиве Infinity, если не работает.
115 Garykom
 
гуру
29.01.16
13:56
(114) а каким значком в 1С можно заменить "8" на боку то?
116 Кирпич
 
29.01.16
13:57
+(114) да и вабще, у тебя 64 склада. даже в 1с считать будет быстро, без ВК можно обойтись. Только алгоритм Дейкстры нужно набивать в 1с (если его нету ещё)
117 Garykom
 
гуру
29.01.16
13:58
(116) 64(склада) * 7(дней в неделе) = ?
вообще то
118 Кирпич
 
29.01.16
13:58
(115) зачем тебе значки? буквами напиши или цифрами.
119 Кирпич
 
29.01.16
14:00
(117) ну это ты так решил. может же быть и по другому.
120 Кирпич
 
29.01.16
14:01
(117) они у тебя по нескольку дней ездят? типа дальнобойщики?
121 Garykom
 
гуру
29.01.16
14:02
Блин как в 1С получить разницу в днях между 2 днями недели по нормальному течению?

1(Пн) - 4(Чт) = 3 дня разницы
4(Чт) - 1(Пн) = 4 дня
5(Пт) - 1(Пн) = 3 дня
122 Garykom
 
гуру
29.01.16
14:03
(121)+ в смысле переход Вс-Пн когда с 7 дня на 1 день по кругу это учитывать?
123 Garykom
 
гуру
29.01.16
14:04
(120) они заразы до 14 дней ездят
124 Garykom
 
гуру
29.01.16
14:04
(119) по другому уже Флойд работать не будет )) и нужен волновой или еще что
125 Кирпич
 
29.01.16
14:07
(124) а я не знаю чем тебе Флойд поможет.
Рёбра у тебя в часах пути или в километрах?
126 Garykom
 
гуру
29.01.16
14:08
(121) Так правильно?

Если ТекДеньКуда>=ТекДеньОткуда Тогда
   ДлинаВДнях = ТекДеньКуда - ТекДеньОткуда;
Иначе
   ДлинаВДнях = (7 - ТекДеньОткуда) + ТекДеньКуда;
КонецЕсли;
127 Garykom
 
гуру
29.01.16
14:08
(125) ребра в СрокТранзита или СрокТранзита + 1 день иногда
128 Кирпич
 
29.01.16
14:10
(127) в днях чтоли
129 Garykom
 
гуру
29.01.16
14:12
(128) угу
130 Кирпич
 
29.01.16
14:17
(129) так они у тебя комивояжеры
131 Кирпич
 
29.01.16
14:19
интересная фигня получается. таблицу дашь поглядеть?
132 Garykom
 
гуру
29.01.16
14:19
(130) еще те млин вояжеры

(131) потом как сдам выложу с демо данными своими придумаю
133 Кирпич
 
29.01.16
14:21
(132) ну ладна. парься сам тогда. займусь чем нибудь другим.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший