О конвергенции, 256-ти байтах и 32-х полях



Posted by Аркадий Водяник on August 14, 1999 at 23:06:04:

In Reply to: Ответы Бориса почти без вопросов. posted by Борис, Киев. on August 14, 1999 at 14:13:00:

:: За последние 3 дня (с 11-го по 13-е августа) Вы, Борис, задали
:: мне 12 (!) вопросов.
:К чему акцент? Это плохо или хорошо, или мне нужно быть скромнее или как?

Хотите прямого ответа? По 4 вопроса в день - это МНОГО. Дать внятный
письменный ответ на них трудно. Надо же и другими делами заниматься.
Ведь можно и не всегда задавать вопросы в явной форме, a просто излагать
свое видение проблем, и не обижаться, если ответa сразу не будет.

::МЫ НЕ СОБИРАЕМСЯ ДО БЕСКОНЕЧНОСТИ РАЗВИВАТЬ "ЛОКАЛ".
::Я УЖЕ ГОВОРИЛ О "КОНВЕРГЕНЦИИ" КЛИЕНТ-СЕРВЕРНОЙ И ОДНОПОЛЬЗОВАТЕЛЬСКИХ
::ВЕРСИЙ. ГОРАЗДО ПОЛЕЗНЕЕ РАЗВИВАТЬ КЛИЕНТСКИЕ ЧАСТИ ДО ФУНКЦИОНАЛЬНОСТИ
::ОДНОПОЛЬЗОВАТЕЛЬСКИХ ВЕРСИЙ, ТАК ЧТО ОДНОПОЛЬЗОВАТЕЛЬСКАЯ ВЕРСИЯ СТАНЕТ
::ЧАСТНЫМ СЛУЧАЕМ КЛИЕНТ-СЕРВЕРНОЙ.

:Извините, НО
:"Советский энциклопедический соварь",Изд-во "советская энциклопедия", 1989г.
:КОНВЕРГЕНЦИЯ- в языкознании, схождение, взаимоуподобление элементов языка, а также самих
:языков(противопоставляется дивергенция)
:ДИВЕРГЕНЦИЯ- размежевание диалектов или вариантов одного языка и превращение их в самостоят. языки.
:Аркадий, или Вы устали, или я все-таки не отдохнул этим летом.
:Если бы в последнем предложении Вы сказали не "развивать клиентские части", а ОПУСКАТЬ К
:функциональности .., то с логикой было бы все нормально, но не с идеей.

Ох уж это Ваше "HO". Вы не тот словарь взяли, Борис. Надо было взять
политический словарь - и не периода перестройки, а конца 70x-начала 80x годов.
Там "конвергенция" трактуется как буржуазная теория сближения, слияния
социализма и капитализма. Я сказал "развивать клиентские части", и это значит,
что в них надо добавить редакторы дерева, файлов-коэффициентов, плана счетов
После этого можно будет работать только в клиент-серверной среде, никогда
больше не используя однопользовательскую версию для настройки правил.
Ну чем не полное сближение двух систем? И никакого дискомфорта при отладке
то там то здесь.

:По поводу 32 полей, решение мне лично не совсем понятное, если оно приведет
:к непропорциональному увеличению расхода ресурсов, или этого не будет?
:И по идее желательно иметь соответствие между количеством полей факта и
:кол-вом вопросов-ответов в операции, или я не прав в принципе?
:Ведь одно дело "выкручивать" поля в ф-к и другое отдать предработу форме и
:послать заполненный запрос и чисто без нагрузок в ф-к сбросить на факт.
:И размер каждого поля в 256 байт мне кажется расточительным. Хотелось бы
:соизмерить выигрыш с фактической расточительностью.

Здесь нет расточительности. 256 байт - это предельная длина поля.
Как обычно, числовое поле занимает 8 байт, a строковое - длина строки плюс 1.
То есть поля фактов всегда хранились и хранятся упакованно.
Расход памяти на хранение фактов остается таким же, как и раньше, если не
считать дополнительых 2-х байт на каждый факт: элемент Telems структуры
факта (см 302) теперь имеет длину не 2, а 4 байта - по одному биту на поле.

И почему желательно иметь соответствие между предельными количествами
вопросов в операции и предельным количеством полей факта? Это не так.

Рассмотрим пример.

Пусть есть два прототипа фактов. И все четыре % в каждом прототипе
предназначены для хранения полезной, так сказать, прямой, информации:



Приход денег %, %, %, %

Расход денег %, %, %, %


Причем надо иногда делать поиск только по "Приход денег", а иногда -
только по "Расход Денег". Но вот потребовалось последовательно найти
и обработать все все факты и по "Приход денег", и по "Расход денег".

Рассмотрим 2 способа решения этой задачи:

а) Плохой способ. Через search ?переменная. To есть сканируем ленту
фактов, сравнивая значение переменной с искомыми прототипами:



:L
search ?A,?B,?C,?D,?E
if [success]
if (A = 'Приход денег')|(A = 'Расход денег')
.... обработка ....
endif
goto L
endif


Понятно, что при таком подходе "Быстрые факты" не помогают.


b) Eсть способ лучше. Через дополнительное поле. Отнесем прототипы
"Расход денег" и "Приход денег" к одному классу прототипов - "Деньги".
И будем записывать этот класс в виде строки в дополнительном поле.
То есть вместо


fact Приход денег i,j,k,n
или
fact Расход денег i,j,k,n

будет


fact Приход денег i,j,k,n, 'Деньги'
или
fact Расход денег i,j,k,n, 'Деньги'

Тогда поиск можно ускорить: помогут, в частности, "Быстрые факты":



:L
search {6,'Деньги'}
if [success]
.... обработка ....
goto L
endif

Таким образом, дополнительное поле (вместо 6-ти значной строки 'Деньги',
туда для экономии можно было бы записать что-нибудь покороче - например,
просто 'Д' - но не число, так как оно восьмибайтовое), явилось эквивалентом
оператора оператора "или" в условии поиска.

Вместо новой конструкции

search {6,'Деньги'}
 

можно записать по-старому

search ?a,?b,?c,?d,?e,'Деньги'
 

это работает так же.




Пpишедшие ответы: