Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
В Cache' есть прекрасная вещь – многомерные массивы. Они мне прекасно подходят для хранения кэшированных расчетных данных в таком варианте: ^Data(dim1,dim2,dim3,….dim10) Массив разряженный, кол-во возможных елементов по "первым" трем-четырем размерностям около 1000, еще нескольким размерностям - несколько сотен, оставшиеся - несколько десятков. В массиве предполагается хранить double+int+int Чего можно ожидать от доступа к такому массиву? Приличной производительности или полных тормозов? Может быть есть рекомендации для таких случаев? Например не более X размерностей если кол-во елементов >Y или чтото еще? Спасибо,Стас ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 12:17 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
или это случай когда надо брать обычный Persistent класс и строить bitmap индексы? Если да какой порядок разницы в производительности ожидать по сравнению с массивом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 12:27 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
StplВ Cache' есть прекрасная вещь – многомерные массивы. Они мне прекасно подходят для хранения кэшированных расчетных данных в таком варианте: ^Data(dim1,dim2,dim3,….dim10) Массив разряженный, кол-во возможных елементов по "первым" трем-четырем размерностям около 1000, еще нескольким размерностям - несколько сотен, оставшиеся - несколько десятков. В массиве предполагается хранить double+int+int Чего можно ожидать от доступа к такому массиву? Приличной производительности или полных тормозов? Может быть есть рекомендации для таких случаев? Например не более X размерностей если кол-во елементов >Y или чтото еще? Спасибо,Стас Сомнительно, что необходима такая глубина. Обычно 4-5 - уже предел, глубже лезть нет смысла. Не забывай, что добираться до нижних уровней придется через верхние, а это ненавидимые всеми р-субдшниками (sic!) вложенные циклы, не очень удобно. :) Неплохо было бы посмотреть что за данные, может подсказал бы другой вариант. Что то double, int и прочего, нет в M типизации, и в объектах она ложная, можно конечно паковать через $zl, $zw, но ведь и распаковывать придется. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 13:32 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Sergei ObrastsovСомнительно, что необходима такая глубина. Обычно 4-5 - уже предел, глубже лезть нет смысла. Не забывай, что добираться до нижних уровней придется через верхние, а это ненавидимые всеми р-субдшниками (sic!) вложенные циклы, не очень удобно. :) имхо у меня не совсем так: логика построения значений индекса для доступа к массиву всеравно отдельная. Т.е. вызывать ^Data(1000,500,1) или ^Data(33,800,999) определяется отдельной "бизнес:)логикой" и какими средствами она расчитывает индексы сейчас не так важно. меня больше интересует эффективность доступа к тому что я записал в массив т.е. set ^Data(1000,500,1)=DataItem ... $Data(^Data(1000,500,1),DataItem) Или такой подход совсем неверный? Sergei ObrastsovНеплохо было бы посмотреть что за данные, может подсказал бы другой вариант. не хочется загружать конкретными проблемами, это скорее задача для пилота от Intersystems :) с OLAP вы знакомы на уровне общих представлений? Если да то могу попробовать описать в их "терминах", это наверное немного удобнее. Sergei Obrastsov Что то double, int и прочего, нет в M типизации, и в объектах она ложная, можно конечно паковать через $zl, $zw, но ведь и распаковывать придется. :) сорри: %Double, %Integer я планировал писать в массив объекты простого класса например: Код: plaintext 1. 2. 3. 4. Доступа к ^Data "извне" не будет. бизнес-слой будет спрашивать значение у другого класса, который: - определяет индексы для запрошенных данных - провереяет наличие их в ^Data - если их еще нет, или они помечены как устаревшие то считывает их "перебирая" ^Data() для зависимых данных и записывает результат тудаже в ^Data. При изменении исходных данных (в другом классе) срабатывает или триггер или например %OnAfterSave которые для всех данных зависящих от измененных и существующих в ^Data выставляют флажок Dirty (моя пропертя) и записывает изменный DataItem в ^Data Это совсем криво или не очень? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 14:08 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Stpl имхо у меня не совсем так: логика построения значений индекса для доступа к массиву всеравно отдельная. Т.е. вызывать ^Data(1000,500,1) или ^Data(33,800,999) определяется отдельной "бизнес:)логикой" и какими средствами она расчитывает индексы сейчас не так важно. автор Они мне прекасно подходят для хранения кэшированных расчетных данных в таком варианте: ^Data(dim1,dim2,dim3,….dim10) Это кто писал? :) В данном варианте получается 10 уровней, что несколько пугает. Stpl меня больше интересует эффективность доступа к тому что я записал в массив т.е. set ^Data(1000,500,1)=DataItem ... $Data(^Data(1000,500,1),DataItem) Или такой подход совсем неверный? Почему "неверный"? Нормальный подход. Тем более я не знаю что и зачем хранится. Stpl не хочется загружать конкретными проблемами, это скорее задача для пилота от Intersystems :) с OLAP вы знакомы на уровне общих представлений? Если да то могу попробовать описать в их "терминах", это наверное немного удобнее. Пиши, попробуем разобраться. Stpl Sergei Obrastsov Что то double, int и прочего, нет в M типизации, и в объектах она ложная, можно конечно паковать через $zl, $zw, но ведь и распаковывать придется. :) сорри: %Double, %Integer За что "сорри"-то? :) Я же говорю, это "ложная" типизация. На самом деле все пишется символьной строкой. Stpl При изменении исходных данных (в другом классе) срабатывает или триггер или например %OnAfterSave которые для всех данных зависящих от измененных и существующих в ^Data выставляют флажок Dirty (моя пропертя) и записывает изменный DataItem в ^Data Это совсем криво или не очень? Да нормально это. Все-таки интересно было бы посмотреть на предполагаемые структуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 14:20 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Количество размерностей на скорость доступа особой роли не играет - вот количество узлов да. Вместо локальных переменных свыше 1000 узлов рекомендуеться использовать глобалы. использовть или нет персистент зависить от того нужно ли вам эти расчётные данные обрабатывать в соотвествии с транзакциями или нет. Лично я такого не держу. У меня вообще весь расчет во времянке - зато легко реализуется предварительный расчет. А рекомендуем сильнее использовать косвенную адресацию - она позволяет обходить кол-во размерностей. >>set ^Data(1000,500,1)=DataItem ... $Data(^Data(1000,500,1),DataItem) Наверное всё таки $Get а не $Data - скажем так - это максимально достижимая на Каше эффективность. >>сорри: %Double, %Integer Но уровне прямого доступа это один фиг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 14:21 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
PtnКоличество размерностей на скорость доступа особой роли не играет - вот количество узлов да. Ну, конечно. Я посмотрю как Вы будете до 10-го уровня добираться. Или "лихим наскоком", через $Query? А ежели данные на каждом уровне? :) Ptn А рекомендуем сильнее использовать косвенную адресацию - она позволяет обходить кол-во размерностей. Точно-точно. При этом достигается сразу 2 цели: программа просаживается по скорости, что очень радует окружающих и становится абсолютно нечитаемой, что очень радует сопровождающих. Ptn >>set ^Data(1000,500,1)=DataItem ... $Data(^Data(1000,500,1),DataItem) Наверное всё таки $Get а не $Data - скажем так - это максимально достижимая на Каше эффективность. Не факт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 14:32 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Stpl Это совсем криво или не очень? совет кашиста - рецидивиста быстро сделайте основу программы без деталей и бантиков как угодно но на рабочих реальных данных и запустите затем вносите поправки уточнения по скорости в узких местах часто тормоз не там где думали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 16:02 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Sergei Obrastsov автор Они мне прекасно подходят для хранения кэшированных расчетных данных в таком варианте: ^Data(dim1,dim2,dim3,….dim10) Это кто писал? :) В данном варианте получается 10 уровней, что несколько пугает. я писал:) Да, в этом примере 10 уровней для организации глобала ^Data. Sergei ObrastsovЯ же говорю, это "ложная" типизация. На самом деле все пишется символьной строкой. а, ну да... не привык еще. Sergei Obrastsov Все-таки интересно было бы посмотреть на предполагаемые структуры. CASE средствами увы не пользуюсь, а ч.б. выслать как-есть... пока еще нечего... полные классы пока еще не рисовал т.к. борюсь с азами и синтаксисом. Если вкратце "на словах". Объекты справочники - они же размерности в терминах olap: OrgTree, AcountsTee,ProductsTree,BusinessTree,UserTree,... - это деревья по структуре: классы вероятно с parent-child Relationship "на себя" (обычное SQL решение, похоже в каше готовой поддержки нету. Наверное сделаю для них базовый классик с поддержкой нужных функций дерева) Currencies,DataLevels,AccountingPeriods,...- классы для "обычных плоских" таблицы со своими пропертями Основная таблица данных или фактов: класс с пропертями ID для каждой размерности (например OrgID, AccountID, Date, ….) и данными Value,Currency,… ну и вспомогательные таблички типа ExchangeRates. Если бы это было на олап моторчике то былабы еще размерность времени с несколькими иерархиями: Year-HalfYear-…. Year-Week-…. И т.п. Здесь встрою ее как есть внутрь расчетной части ^Data я предполагал как массив с доступом по полной комбинации всех ключевых размерностей, например ^Data(OrgID,AccountID,Date,….). Это конечно не ответ на заданный вопрос но словесное описание нижнего слоя, надеюсь это обясняет почему в ^Data хочется много уровней. Дальше я еще не готов.... освоение целины продолжается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 16:04 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
MX -- ALEX Stpl Это совсем криво или не очень? совет кашиста - рецидивиста быстро сделайте основу программы без деталей и бантиков как угодно но на рабочих реальных данных и запустите затем вносите поправки уточнения по скорости в узких местах часто тормоз не там где думали пытаюсь.... медленно получается ;) в смысле не пишется очень медленно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 16:06 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Stpl^Data я предполагал как массив с доступом по полной комбинации всех ключевых размерностей, например ^Data(OrgID,AccountID,Date,….). Это конечно не ответ на заданный вопрос но словесное описание нижнего слоя, надеюсь это обясняет почему в ^Data хочется много уровней. Дальше я еще не готов.... освоение целины продолжаетсяОбъяснять-то объясняет... И все-таки я советовал бы задуматься над структурой. Совершенно не обязательно делать ^Data(OrgID,AccountID,Date,...), когда можно сделать: Код: plaintext 1. 2. 3. Это конечно всего лишь вариант "развешивания по веткам", но принцип надеюсь понятен. Конечно хочется реализовать то, что видишь сразу, но обычно приходится либо возвращаться и переписывать все структуры, либо мучиться с промежуточными массивами, делая то же самое, что предлагаю я, только на единственной "узкой" структуре и только на время конкретного запроса. Выигрыша понятное дело никакого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 16:48 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
MX -- ALEX Stpl Это совсем криво или не очень? совет кашиста - рецидивиста быстро сделайте основу программы без деталей и бантиков как угодно но на рабочих реальных данных и запустите затем вносите поправки уточнения по скорости в узких местах часто тормоз не там где думали Плохой совет. :( Обычно это приводит к неуклюжей программе/комплексу, который больше половины своего времени тратит на создание промежуточных массивов, только из-за того, что структуры не были продуманы изначально. Не надо давать такие советы новичкам, плохих программ и без этого полным-полно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 16:56 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Sergei ObrastsovЭто конечно всего лишь вариант "развешивания по веткам", но принцип надеюсь понятен. конечно понятен но не подходит. Данные в ^Data мне нужны на пересечении всех размерностей. Т.е. данные за AccountID=1 сами по себе не имеют смысла, они появляются только когда определены все остальные размерности Date,OrgID и т.д. А этот вариант подошелбы например для реализации олаповских запросов по неполным размерностям, там действительно можно спросить данные например только по одной размерности, при этом для всех остальных будет принято некоторое дефолтное значение. Но мне это сейчас не нужно, я подбираю хранение результата на пересечении всех размерностей/индексов. Например HyperIndex из этой области, но я думал попытаться обойтись глобалом т.к. данных не так уж и много. и я полагал что простой глобал быстрее таблицы пусть даже с bitmap индексами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 17:20 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Sergei ObrastsovПлохой совет. :( Обычно это приводит к неуклюжей программе/комплексу, который больше половины своего времени тратит на создание промежуточных массивов, только из-за того, что структуры не были продуманы изначально. Не надо давать такие советы новичкам, плохих программ и без этого полным-полно. Я в защиту MX -- ALEX! Я сейчас "плохо видеть и говорить на M, COS и т.п." и одним теоретическим проектированием тут мне не обойтись, нужны эксперименты, и как раз именно сейчас. потом будет поздно потому что их небыло вначале :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 17:25 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Sergei ObrastsovНу, конечно. Я посмотрю как Вы будете до 10-го уровня добираться. Или "лихим наскоком", через $Query? А ежели данные на каждом уровне? :) Ну зачем же так жестоко - данные они ж с определенным умыслом так зафигачены. У меня правда всего 8-мь уровней Sergei Obrastsov Точно-точно. При этом достигается сразу 2 цели: программа просаживается по скорости, что очень радует окружающих и становится абсолютно нечитаемой, что очень радует сопровождающих. насчет скорости - чем то всё равно придётся жертвовать а вот насчет читабельности резко не соглашусь - косвенность позволяет выделить обработу отдельных кусков - в нормальню запись. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. >>Не факт. Поясните ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 18:16 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Ptn Sergei ObrastsovНу, конечно. Я посмотрю как Вы будете до 10-го уровня добираться. Или "лихим наскоком", через $Query? А ежели данные на каждом уровне? :) Ну зачем же так жестоко - данные они ж с определенным умыслом так зафигачены. У меня правда всего 8-мь уровней Странный ответ. Так как ходим до 8-го уровня-то, через $Query или 8 вложенных циклов? Ptn Sergei Obrastsov Точно-точно. При этом достигается сразу 2 цели: программа просаживается по скорости, что очень радует окружающих и становится абсолютно нечитаемой, что очень радует сопровождающих. насчет скорости - чем то всё равно придётся жертвовать а вот насчет читабельности резко не соглашусь - косвенность позволяет выделить обработу отдельных кусков - в нормальню запись. А почему чем-то обязательно "придется жертвовать"? Я например ничем жертвовать не хочу. Косвенность дает гибкость, я согласен, иногда приходится использовать, особенно на неизвестных структурах, тут уж по-другому никак. Но жертовать скоростью и порядочностью программы из-за нежелания дублировать несколько строк - это несерьезно. Ptn Код: plaintext 1. 2. 3. 4. 5. 6. 7. Не разумнее ли было бы переписать так: Код: plaintext 1. 2. 3. 4. а еще разумнее Код: plaintext 1. 2. 3. 4. Ptn Код: plaintext 1. 2. 3. 4. Ага. Именно поэтому смущенно отводят глаза в сторону при вопросах о производительности SQL и объектов в Cache. Ptn И потом кому кукое дело где реально этот узел лежит - хоть запереносись его по реальной структуре Замечательный подход. :) Ptn >>Не факт. Поясните ? На пальцах? Давайте конкретные примеры, посмотрим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 23:37 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
StplЯ в защиту MX -- ALEX! Я сейчас "плохо видеть и говорить на M, COS и т.п." и одним теоретическим проектированием тут мне не обойтись, нужны эксперименты, и как раз именно сейчас. потом будет поздно потому что их небыло вначале :) Эксперименты конечно нужны, но нельзя подходить к программе таким способом, дескать главное начать, а потом поправим. К сожалению, на практике оказывается, что поправлять бывает поздно и приходится уже идти начатым путем. Сколько раз на вопрос "А почему через ж...?" приходилось слышать грустный ответ "Ну вот, так получилось, возвращаться уже поздно было". Посему совет: лучше просидеть на старте больше положенного, зато получить удобные структуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 23:43 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Sergei ObrastsovЭксперименты конечно нужны, но нельзя подходить к программе таким способом, дескать главное начать, а потом поправим. К сожалению, на практике оказывается, что поправлять бывает поздно и приходится уже идти начатым путем. Сколько раз на вопрос "А почему через ж...?" приходилось слышать грустный ответ "Ну вот, так получилось, возвращаться уже поздно было". Посему совет: лучше просидеть на старте больше положенного, зато получить удобные структуры. абсолютно согласен. только я как раз на старте и сижу. причем похоже еще гдето в раздевалке :| но это мои проблемы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 23:57 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
StplНо мне это сейчас не нужно, я подбираю хранение результата на пересечении всех размерностей/индексов. Нда... Ну ладно, смотрим: Код: plaintext 1. Получить данные по Date (я правильно полагаю что это дата?) можно только уже имея OrgID и AccoutID. Ну а если необходима разбивка по датам? А если нужен конкретный диапазон дат? Stpl Например HyperIndex из этой области, но я думал попытаться обойтись глобалом т.к. данных не так уж и много. и я полагал что простой глобал быстрее таблицы пусть даже с bitmap индексами HyperIndex - вещь конечно хорошая, но не стоит забывать об объемах. Особенно на больших массивах данных и уж тем более при bit-slicing. Ну вот такой пример: при 200,000,000 записей в БД получаем 3125 chunks по 64,000 бит на одно значение. Я не уверен, что это разумный подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 00:04 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Stpl Sergei ObrastsovЭксперименты конечно нужны, но нельзя подходить к программе таким способом, дескать главное начать, а потом поправим. К сожалению, на практике оказывается, что поправлять бывает поздно и приходится уже идти начатым путем. Сколько раз на вопрос "А почему через ж...?" приходилось слышать грустный ответ "Ну вот, так получилось, возвращаться уже поздно было". Посему совет: лучше просидеть на старте больше положенного, зато получить удобные структуры. абсолютно согласен. только я как раз на старте и сижу. причем похоже еще гдето в раздевалке :| но это мои проблемы... Сергей мне кажется в данной конкретной ситуации нашему уважаемому коллеге все же надо ввязаться в драку и получить материал для размышлений естественно опытный образец программы затем весь переписать заново ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 00:45 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
MX -- ALEX Stpl Sergei ObrastsovЭксперименты конечно нужны, но нельзя подходить к программе таким способом, дескать главное начать, а потом поправим. К сожалению, на практике оказывается, что поправлять бывает поздно и приходится уже идти начатым путем. Сколько раз на вопрос "А почему через ж...?" приходилось слышать грустный ответ "Ну вот, так получилось, возвращаться уже поздно было". Посему совет: лучше просидеть на старте больше положенного, зато получить удобные структуры. абсолютно согласен. только я как раз на старте и сижу. причем похоже еще гдето в раздевалке :| но это мои проблемы... Сергей мне кажется в данной конкретной ситуации нашему уважаемому коллеге все же надо ввязаться в драку и получить материал для размышлений естественно опытный образец программы затем весь переписать заново Дык, Алекс, разве я спорю? :) Только вот кто ему скажет, что надо все переписать заново? Работает, да работает. А плохие привычки приживаются влет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 00:56 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Sergei Obrastsov Код: plaintext 1. AccoutID. Ну а если необходима разбивка по датам? А если нужен конкретный диапазон дат? тогда мы работаем с датами спустившись к ним по Org и Account. А ^Data("d",Date) вроде мне ничего не даст т.к. мне туда и записать то ничего. Можно конечно пойти по пути ^Data("OrgID,AccountID",Date) но это тогда скорее обычная таблица с составным ключем. Sergei Obrastsov Stpl Например HyperIndex из этой области, но я думал попытаться обойтись глобалом т.к. данных не так уж и много. и я полагал что простой глобал быстрее таблицы пусть даже с bitmap индексами HyperIndex - вещь конечно хорошая, но не стоит забывать об объемах. Особенно на больших массивах данных и уж тем более при bit-slicing. Ну вот такой пример: при 200,000,000 записей в БД получаем 3125 chunks по 64,000 бит на одно значение. Я не уверен, что это разумный подход. наверное, но для таких количеств говорить о глобалах наверное тоже неразумно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 09:34 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Stplтогда мы работаем с датами спустившись к ним по Org и Account. А потом группируем по датам в другом массиве? :) Stpl А ^Data("d",Date) вроде мне ничего не даст т.к. мне туда и записать то ничего. Да ну? А ^Data("d",Date,Org,Account) не получится? :) Stpl Sergei Obrastsov HyperIndex - вещь конечно хорошая, но не стоит забывать об объемах. Особенно на больших массивах данных и уж тем более при bit-slicing. Ну вот такой пример: при 200,000,000 записей в БД получаем 3125 chunks по 64,000 бит на одно значение. Я не уверен, что это разумный подход. наверное, но для таких количеств говорить о глобалах наверное тоже неразумно? Серьезно?! Это еще почему?! Прекрасно все работает и для больших количеств :) Просто использование bitmap должно быть разумным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 09:52 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Sergei Obrastsov Stplтогда мы работаем с датами спустившись к ним по Org и Account. А потом группируем по датам в другом массиве? :) Stpl А ^Data("d",Date) вроде мне ничего не даст т.к. мне туда и записать то ничего. Да ну? А ^Data("d",Date,Org,Account) не получится? :) а в чем тогда выигрыш по адресации к отдельным элементам? если я правильно понял это нам дает возможность легко пройти по всем Date+Org или по Date независимо то Org и Account. Т.е. первыми вершинами дерева взять даты и использовать это при нарезке по датам. но дальше мне ведь надо искать нужные Org и Account. Т.е. как я понимаю ^Data("d", ^Data("o"... могут понадобится как дополнительные глобалы а не как замена ^Data(Org,Account,Date) Или я никак не пойму чтото главное? Sergei ObrastsovСерьезно?! Это еще почему?! Прекрасно все работает и для больших количеств :) Просто использование bitmap должно быть разумным. у.... кофе мало выпил, ерунду написал. Глобал, таблица, здесь же они близнецы братья. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 10:12 |
|
||
|
Производительность доступа к многомерному массиву
|
|||
|---|---|---|---|
|
#18+
Sergei Obrastsov >>Странный ответ. Так как ходим до 8-го уровня-то, через $Query или 8 вложенных циклов? Нет никакого смысла обрабатывать всё уровни одновременно. Так что конечно циклы - но они разнесены - каждый кусок кода работает со своей частью. >>Не разумнее ли было бы переписать так: Нужно будет взглянуть.... ссылка на последний "глобал" ? В кирстене такой подход не рассматривается :( хотя встречал его в некоторых %рутинах >>Замечательный подход. :) Нормальный подход - структур может быть несколько одинаковых в разных узлах или просто в разных глобалах. Лично я использую для переноса расчетов в локальную память. >>На пальцах? Давайте конкретные примеры, посмотрим. Не понял .... возьмите $d - в языке есть нечто более эффективное для её функции ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2007, 10:57 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=34276869&tid=1559410]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 406ms |

| 0 / 0 |
