Как организовать хранение данных с большим адресным пространством, оставив прямую адресацию? для 1С


Динамическая структура прямой адресации.
Автор Семенов М.Б. Кострома, Россия 2007г.

В данной статье пойдет речь об оптимизации структур данных.
В связи все большими гигагерцами и растущими объемами памяти оптимизация структур данных... зачем?
В области больших объемов хранимых данных, обсчета глобальных процессов (природных?) со многими
неизвестными, перебора игровых комбинаций используется скорее всего не "1С-ка". Попробовать свои силы?
Читая статью svsrus //infostart.ru/articles/230/ решился исследовать эту тему.

В частности, в рассмотренной статье используется таблица значений (кол-во строк : кол-во столбцов)
для хранения значений, раскиданных по "площади". И чем больше эта площадь, тем больше надо будет
памяти. (для ТЗ 1000 х 1000 это 80мб). И скорее всего, из задействованного адресного пространства
для хранения будет использовано не более одного процента. Что же можно предпринять?

Первый вариант: можно добавлять в ТЗ строки и столбцы по мере увеличения адреса значений.
Это можно использовать, если известно, что поступающие в структуру значения первоначально будут
с "маленькими" адресами. В противном случае при первом же поступлении значения с адресом 1000:1000
ТЗ достигнет максимального размера.

Второй вариант: использовать структуры без адресации, например, список значений. Значения из СЗ будем
получать по "представлению" адреса в виде "<НомерСтроки>:<НомерСтолбца>". Подойдет для небольших объемов
СЗ, все-таки поиск значения методом перебора "Получить()" работает медленно. Можно воспользоваться
объектом XBase и на его основе построить структуру аналогичную СЗ, но с индексированным адресом.
Считаю, что это "быстрое" и экономное решение, к тому же достаточно легкое в реализации.

Третий вариант, собственно, сама тема. Идея почти такая же как и в первом варианте - увеличивать
нашу ТЗ по мере поступления значений, только их адреса предварительно пропускать через
"функцию переадресации", уменьшающую количество разрядов реального адреса в ТЗ. Предположу, что такая
"переадресация" очень широко используется в ВТ на аппаратном и на низком уровне программирования.

На примере "площади" это выглядело бы примерно так:

1. Квадрат 25 х 25 разбиваем на подквадраты 5 х 5.
2. Функция переадресации преобразует прямые координаты в <НомерПодквадрата> и <НомерЯчейкиВподквадрате>, причем
нумерация подквадратов и ячеек в них выполняется последовательно по мере поступления новых адресов.
3. Используем полученные координаты как прямые. И будем расширять нашу структуру по мере увеличения адресов.

Во внешней обработке показана упрощенная "одномерная" реализация, используется только "НомерПодквадрата",
основная таблица для хранения данных увеличивается "порциями", - "подквадратами", которые добавляются
вниз таблицы.

Основные функции "переадресации" взамен встроенных методов "ПолучитьЗначение()" и "УстановитьЗначение()":
"ПолучитьЗначТЗ()" и "УстановитьЗначТЗ()" с теми же параметрами.

Для особо больших объемов можно использовать аналогичную перадресацию и для структуры данных в самой
функции переадресации. На любителя рекурсий. :)

Успехов!

29.10.2007
Добавлена внешняя обработка DinTVMultiLevel.ert - развитие идеи, предложенной Fixin,
ее суть: функцию переадресации сделать "жесткой", без использования в ней же дополнительных
структур данных, - "правила" адресации будут "зашиты там же, в основной структуре данных.

В обработке используется объект "ТаблицаЗначений", работа с ним производится след. образом:

НомерСтроки два младших разряда текущего адреса
Колонка 1 (без имени) - значение по указанному конечному адресу (или самым старшим разрядам от него)
Колонка 2 "Ссылка" - ссылка на объект "ТаблицаЗначений" для доступа к значениям с дополнительными
старшими разрядами адреса (новый уровень ТЗ)

На примере это будет выглядеть так:

получить значение по адресу 15: ТЗ.ПолучитьЗначение(15,1);
получить значение по адресу 115: ТЗ.ПолучитьЗначение(15,"Ссылка").ПолучитьЗначение(01,1);
получить значение по адресу 340115: 
ТЗ.получитьЗначение(15,"Ссылка").ПолучитьЗначение(1,"Ссылка").ПолучитьЗначение(34,1);



Адресация сделана одномерной, как в массиве, однако, ничто не мешает ее использовать для
структур с несколькими измерениями с предварительным приведением всех адресов измерений к одному.

Параметры функций и процедур изменены, см. в коде обработки.

https://infostart.ru/public/15206/

Скачать:
15206_1_Kak_organizovat_hranenie_dannyh_s_bolshim_adresnym_prostranstvom,_ostaviv__pryamuyu__adresat...
15206_2_Kak_organizovat_hranenie_dannyh_s_bolshim_adresnym_prostranstvom,_ostaviv__pryamuyu__adresat...