Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Оптимизация IndexedTable (число прочтений - 14478 )
victuan
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Зарегистрирован: 02. Июля 2007
Оптимизация IndexedTable
03. Июля 2007 :: 03:35
Печать  
Больше года назад эта тема была поднята на форуме Itland.ru (http://www.itland.ru/forum/lofiversion/index.php/t14011.html). Сейчас этот ресурс недоступен, а объект ИндексированнаяТаблица продолжает развиваться. Поэтому хотелось бы поднять этот вопрос снова.

Вот выдержки из этого форума:

Как известно, стандартная (встроенная в 1С) ТаблицаЗначений испытывает проблемы при большом количесте хранимых данных (напр. загибается на нескольких сотнях тысяч строк). Это выражается в неэкономном использования виртуальной памяти, и не стабильной работе (возможно аварийное завершение работы 1С).

Для ИндексированнойТаблицы данная проблема оказалась еще острее: она еще не экономнее использует память (возможно, в частности, из-за отсутствия возможности типизации данных при создании колонок).

Вопрос: будут ли проводится работы для оптимизации ИндексированнойТаблицы в плане производительности и рационального использования ресурсов при обработке больших массивов данных. И если да, то как скоро.

Примером внешней компоненты, в которой данные проблемы решены может выступать ValTable.dll http://1c.proclub.ru/modules/mydownloads/p...lid=3280&cid=92

Примечательны слова, сказанные artbear'ом в противовес данной компоненте:
"ADirks недавно добавил в 1С++ новый супер-объект "ИндексированнаяТаблица". Работает очень быстро и удобно."

Мне бы хотелось, чтобы данный объект и в самом деле стал "супер".

...

Был обнаружен следующий баг (фича?) IndexedTable: при достижении предела выделенной виртуальной памяти данный объект выдает сообщение "Out of memory" и вешает 1С. Объекты же ТаблицаЗначений и ValTable поступают в этом случае более корректно: они запрашивают у системы увеличения файла подкачки, и после получения ресурсов, продолжают работу.

...

Просто интересная реализация хранения одинаковых строк (в ValTable).
...
Т.е. все значения сворачиваются на предмет одинаковых значений и хранятся в списке. А сами элементы ТЗ хранят не сами значения, а 4-байтную ссылку на элемент из этого списка.

Но оказывается тоже самое делает 1С в своих ТЗ! Но только в отношении данных типа "Строка" (вот не ожидал от них такого полета мысли).

...

Провел более подробные тесты. Тестировал следующие параметры:
а) скорость создания структуры (НоваяСтрока, НоваяКолонка);
б) объем виртуальной памяти, занимаемой структурой;
в) время, необходимое на уничтожение структуры (т.е. присвоение ТЗ = 0).

Не тестировал скорость работы поиска поскольку она, по определению, на высоте.

Итак, при сравнительно малых объемах (напр, 10 колонок на 10 000 строк) 1С-я ТЗ выигрывает по сравнению с IndexedTable: создается быстрее, занимает меньше оперативной памяти. Однако, при больших объемах выигрывает IndexedTable.

Сравнение же IndexedTable и ValTable осложнялось тем, что метод НоваяКолонка() объекта IndexedTable не позволяет явно задать тип данных, а метод НоваяКолонка() объект ValTable, наоборот, требует жесткого указания определенного типа данных.
Поэтому объективно получилось сравнить ValTable только с 1с-ой ТаблицейЗначений, которая позволяет создавать колонки определенного типа.
При этом ValTable резко выигрывает.

....

Для хранения НЕповторяющихся значений лучше всех показала себя 1С-ая ТЗ.
Для хранения повторяющихся значений лучше всех показала себя ValTable.
Хуже всех по исследуемым парметрам оказалась IndexedTable, ресурсов требует в 2 раза больше чем 1с-я ТЗ.

Однако по стабильности при работе с большими массивами данных хуже всех оказалась именно 1С-я ТЗ.

...

На тему освобождения памяти после завершения процесса - это не секрет: CFixedAlloc - менеджер памяти CString

...

Вопросы 2ADirks:
а) не нашел метода, который позволяет в таблице переставлять местами строки;
б) метод Заполнить стандартной ТЗ предоставляет больше возможностей чем метод ЗаполнитьСтроку (и ЗаполнитьКолонку) ИндексированнойТаблицы

...

предел количества строк у 1С-ых ТЗ = 2^24 / 4.



Тест прилагаю.

Это ссылка на эмулятор ТЗ на базе класса ИндексированнаяТаблица: http://1c.proclub.ru/modules/mydownloads/personal.php?cid=137&lid=6257
  

TestIT.zip ( 13 KB | Загрузки )
Наверх
 
IP записан
 
Valet
Full Member
***
Отсутствует



Сообщений: 141
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация IndexedTable
Ответ #1 - 03. Июля 2007 :: 04:41
Печать  
Несколько слов в защиту Индексированной таблицы:
Уж больно тон статьи выглядит обвинительным.
По моему при всех своих перечисленных недостатках (которые во всяком случае решаемы благодаря разработчикам, в отличии от проблем ТаблицыЗначений) Индексированная Таблица имеет ряд плюсов. И эти плюсы существенно перевешивают баго-фичи.
Механизмы объединения и отборов Индексированной Таблицы сложно реализовать стандартными средствами. Да и потеря в производительности будет существнной.
Хотелось бы чтобы все видели этот топик не как недоработки Инджесированной таблицы, а как "Хотелки", которые несомнено будут в будущем реализованы по мере сил разработчиков.

P.S. Склонен заметить иногда нехватает типизации колонок в ИндексированнойТаблице
  

/ Лень - двигатель прогресса. /
Наверх
ICQ  
IP записан
 
victuan
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Зарегистрирован: 02. Июля 2007
Re: Оптимизация IndexedTable
Ответ #2 - 03. Июля 2007 :: 04:46
Печать  
Вовсе тон не обвинительный! Я сам ЗА развитие этого класса. Поэтому я и назвал тему "Оптимизация...", а не "Недостатки...".
Причем я готов сам принять участие в тестировании IT на больших объемах данных, лишь авторы класса меня поддержали.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Оптимизация IndexedTable
Ответ #3 - 03. Июля 2007 :: 04:49
Печать  
Имхо, если встает такая задача, как закинуть в ТЗ такое количество строк, то надо чето в консерватории править.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Оптимизация IndexedTable
Ответ #4 - 03. Июля 2007 :: 05:25
Печать  
orefkov писал(а) 03. Июля 2007 :: 04:49:
Имхо, если встает такая задача, как закинуть в ТЗ такое количество строк, то надо чето в консерватории править.

Согласен. Имхо память на РС не предназначена для большого объема данных и индексированного доступа к ним, для этого предназначен жесткий диск и сервер БД. Понятно что все относительно, но не стоит забывать об этом.
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Оптимизация IndexedTable
Ответ #5 - 03. Июля 2007 :: 07:31
Печать  
Я бы сказал не память не предназначена, а реализация CRT и тем более MFC, местами не предназначены.

Хотя даже мне занятно, как быстро мы дожили до лимита адресации x32 систем.
А я еще помню адресуемые сегменты в 64k, модели tiny-huge и ощущение кайфа, когда обо всем этом удалось забыть.

Переделать ИТ - значит полностью переработать хранение данных и доступ к памяти.
Однако по большей части ядро ИТ (построение индекса и поиск) после этого быстрее работать не станет (имхо и так выжали все, что можно).
Можно оптимизировать только объем памяти на строку и скорость работы со строками (добавление, удаление вставка, сдвиг).

А вообще по опыту такая оптимизация для проходит незаметно и как правило моральной ценности для большинства не представляет.
Ибо все пользователи делятся на некие группы:
  • Незаметные просто не заметят изменений
  • Убежденные твердо знают смысловые пределы использования ("структура - это 50 значений, не больше!")
  • Ограниченные найдут ограничения в любой [новой] реальности
  • Начитанные скажут, что настоящая оптимизация достигается совершенно другими методами
    и т.д.

    И только пара счастливых идиотов будут просто рады просто красивому и просто почти бессмысленному решению.
  • « Последняя редакция: 03. Июля 2007 :: 09:45 - kms »  

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    victuan
    Junior Member
    **
    Отсутствует


    I Love YaBB 2!

    Сообщений: 20
    Зарегистрирован: 02. Июля 2007
    Re: Оптимизация IndexedTable
    Ответ #6 - 04. Июля 2007 :: 01:24
    Печать  
    Ясно, IT не затачивалась под работу с большими объемами данных.

    А как быть все-таки с этим?

    1) При достижении предела выделенной виртуальной памяти IndexedTable выдает сообщение "Out of memory" и вешает 1С (вместо запроса у системы увеличения файла подкачки и получения ресурсов).

    2) Существует утечка памяти при хранении строк: CFixedAlloc - менеджер памяти CString

    3) Нет  метода, который позволяет в таблице переставлять местами строки;

    4) Баги при манипуляции с  IT, хранящей сложные данные: http://www.1cpp.ru/forum/YaBB.pl?num=1183348086

    Ведь это можно реализовать, не переделываю концепцию IT? Тем более kms не отрицает возможность такой доработки: Цитата:
    Можно оптимизировать только объем памяти на строку и скорость работы со строками (добавление, удаление вставка, сдвиг).
      
    Наверх
     
    IP записан
     
    artbear
    1c++ developer
    1c++ moderator
    Отсутствует


    Эх, дайте что-нибудь новенькое
    да полезное потести

    Сообщений: 6303
    Местоположение: Москва
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: Оптимизация IndexedTable
    Ответ #7 - 04. Июля 2007 :: 04:19
    Печать  
    victuan писал(а) 04. Июля 2007 :: 01:24:
    2) Существует утечка памяти при хранении строк: CFixedAlloc - менеджер памяти CString

    Откуда инфа? Тест можешь показать?
      

    OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
    Наверх
    GTalkSkype/VoIPICQ  
    IP записан
     
    artbear
    1c++ developer
    1c++ moderator
    Отсутствует


    Эх, дайте что-нибудь новенькое
    да полезное потести

    Сообщений: 6303
    Местоположение: Москва
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: Оптимизация IndexedTable
    Ответ #8 - 04. Июля 2007 :: 04:22
    Печать  
    victuan писал(а) 04. Июля 2007 :: 01:24:
    3) Нет  метода, который позволяет в таблице переставлять местами строки;

    А смысл? Все равно главное преимущество ИТ - это индексация. Т.е. тут все в основном зависит не от порядка строк, а от их значений.
    Лично мне вроде бы ни разу не понадобилась фича перестановки строк.
      

    OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
    Наверх
    GTalkSkype/VoIPICQ  
    IP записан
     
    victuan
    Junior Member
    **
    Отсутствует


    I Love YaBB 2!

    Сообщений: 20
    Зарегистрирован: 02. Июля 2007
    Re: Оптимизация IndexedTable
    Ответ #9 - 04. Июля 2007 :: 04:27
    Печать  
    Инфа с форума на Itland.ru. Но он в дауне. Поэтому приведу обрывки из сохраненных копий поискового сервера Яндекс.

    http://hghltd.yandex.com/yandbtm?url=http%3A%2F%2Fwww.itland.ru%2Fforum%2Findex....

    На самом деле, виноват не IT, а mfc42. Но от этого не легче.
      
    Наверх
     
    IP записан
     
    victuan
    Junior Member
    **
    Отсутствует


    I Love YaBB 2!

    Сообщений: 20
    Зарегистрирован: 02. Июля 2007
    Re: Оптимизация IndexedTable
    Ответ #10 - 04. Июля 2007 :: 04:32
    Печать  
    artbear писал(а) 04. Июля 2007 :: 04:22:
    victuan писал(а) 04. Июля 2007 :: 01:24:
    3) Нет  метода, который позволяет в таблице переставлять местами строки;

    А смысл? Все равно главное преимущество ИТ - это индексация. Т.е. тут все в основном зависит не от порядка строк, а от их значений.
    Лично мне вроде бы ни разу не понадобилась фича перестановки строк.


    Это нужно мне для подмены методов штатной ТЗ на потомок на базе IT. http://1c.proclub.ru/modules/mydownloads/personal.php?cid=140&lid=6257

    Там правда также возникают проблемы при эмуляции метода Заполнить при "вычурном" заполнении, но они обходимы, а вот со сдвигом проблемы.
      
    Наверх
     
    IP записан
     
    artbear
    1c++ developer
    1c++ moderator
    Отсутствует


    Эх, дайте что-нибудь новенькое
    да полезное потести

    Сообщений: 6303
    Местоположение: Москва
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: Оптимизация IndexedTable
    Ответ #11 - 04. Июля 2007 :: 04:39
    Печать  
    victuan писал(а) 03. Июля 2007 :: 03:35:
    б) метод Заполнить стандартной ТЗ предоставляет больше возможностей чем метод ЗаполнитьСтроку (и ЗаполнитьКолонку) ИндексированнойТаблицы

    Расскажи, в чем разница / чего не хватает
      

    OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
    Наверх
    GTalkSkype/VoIPICQ  
    IP записан
     
    victuan
    Junior Member
    **
    Отсутствует


    I Love YaBB 2!

    Сообщений: 20
    Зарегистрирован: 02. Июля 2007
    Re: Оптимизация IndexedTable
    Ответ #12 - 04. Июля 2007 :: 04:47
    Печать  
    artbear писал(а) 04. Июля 2007 :: 04:39:
    victuan писал(а) 03. Июля 2007 :: 03:35:
    б) метод Заполнить стандартной ТЗ предоставляет больше возможностей чем метод ЗаполнитьСтроку (и ЗаполнитьКолонку) ИндексированнойТаблицы

    Расскажи, в чем разница / чего не хватает


    Заполнить(<?>,,,);
    Синтаксис:
    Заполнить(<Знач>,<НачСтрока>,<КонСтрока>,<Колонки>)
    Назначение:
    Заполнить соответствующие ячейки таблицы значений переданным значением.
    Параметры:
    <Знач> - значение одиночное или список значений или таблица значений.
    <НачСтрока> - необязательный параметр. Номер начальной строки, с которой надо начинать заполнение. Значение по умолчанию 1.
    <КонСтрока> - необязательный параметр. Номер последней строки, по которую надо заполнять. Если не указана, то до последней.
    <Колонки> - необязательный параметр. Номера или идентификаторы колонок, которые надо заполнять. Если параметр не задан, то заполняются все колонки.

    Прикол в <Знач>, в том, он может быть СписокЗначений и ТаблицаЗначений. Т.е. ТЗ может заполняться шаблоном (pattern), типа тексутрной заливки? Я пока сам еще не до конца исследовал эти возможности, а в документации об этом почти ничего нет.
      
    Наверх
     
    IP записан
     
    artbear
    1c++ developer
    1c++ moderator
    Отсутствует


    Эх, дайте что-нибудь новенькое
    да полезное потести

    Сообщений: 6303
    Местоположение: Москва
    Зарегистрирован: 19. Мая 2006
    Пол: Мужской
    Re: Оптимизация IndexedTable
    Ответ #13 - 04. Июля 2007 :: 04:56
    Печать  
    victuan писал(а) 04. Июля 2007 :: 01:24:
    2) Существует утечка памяти при хранении строк: CFixedAlloc - менеджер памяти CString

    Так вроде эту проблему порешили еще в прошлом году Улыбка
    Так и написано в указанной тобой ветке на итланде или в баге на багзилле http://www.1cpp.ru/bugs/show_bug.cgi?id=1917 (статус бага - Исправлено)
      

    OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
    Наверх
    GTalkSkype/VoIPICQ  
    IP записан
     
    victuan
    Junior Member
    **
    Отсутствует


    I Love YaBB 2!

    Сообщений: 20
    Зарегистрирован: 02. Июля 2007
    Re: Оптимизация IndexedTable
    Ответ #14 - 04. Июля 2007 :: 04:58
    Печать  
    Тогда вычеркиваю этот пункт из списка проблем. На год я точно от жизни отстал  Улыбка
      
    Наверх
     
    IP записан
     
    Переключение на Главную Страницу Страницы: [1] 2 3 
    ОтправитьПечать