Получить ссылку на примитив без транзакции

Автор Тема: Получить ссылку на примитив без транзакции  (Прочитано 6189 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
У меня такой вопрос.
К примеру мне известен Handle или ObjectID примитива.
я получаю ссылку на объект getObj через объект транзакции к примеру по ID

' СТАРТУЮ ТРАНЗАКЦИЮ
Dim getObj = transaction.GetObject(ID, ...OpenMode.ForRead) '  беру объект только для чтения.
' ВЫЗОВ МЕТОДА COMMIT

Есть ли возможность получить getObj не используя объект транзакции?

Что-то я подозреваю, что это не возможно при использовании NET API AutoCAD.

У меня этот вопрос возник т.к. я подозреваю, что многократно стартовать транзакцию
для каждого примитива - это долго будет работать.

К примеру нужно получить ссылки на 10 000 на примитивов.
У меня получается так что, я запускаю транзакцию 10 000 раз
и 10 000 раз соотв. делаю transaction.COMMIT

Спрашиваю себя: "Зачем ты делать 10 000 раз однотипную операцию"

Может нужно получить к примеру по массиву ID() сразу массив ссылок - стартовав транзакцию только 1 раз.

 


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
А зачем стартовать транзакцию для каждого примитива? Почему не один раз для всех?

http://bushman-andrey.blogspot.ru/2013/01/database-autocad.html

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Просто хочу услышать мнение экспертов.

У меня к примеру файл dwg (AutoCAd 2012 64 bit)
В файле 50 тысяч элементов в каждом есть не много информации в Xdata (4-5 строчек)

Скажите, чтение этой информации алгоритм выполняет за 25 сек.

Это быстро или медленно?

Учитывая средний комп по производительности (4Г - ОЗУ, CPU core i5).

Мнение некоторых пользователей, говорит о том что
ожидать процесс загрузки данных 25 сек - это долго.

Хочу ускорить до 5 сек. загрузки данных.

Сделал замер времени на примере.
В цикле прочитал координаты центров у 25 тыс. окружностей двумя способами:

1) при каждой итерации цикла стартовал транзакцию и делал commit - время 2300 мс.

2) только в начале цикла стартовал транзакцию и в конце цикла сделал 1 раз commit - время 1300 мс.

Вывод такой 2300/1300 -  получается 2) способ работает в 1,76 раз быстрее.



 

 
« Последнее редактирование: 06-04-2016, 18:24:24 от Алексей (IdeaSoft) »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть ли возможность получить getObj не используя объект транзакции?
Да. Пример: Создание Polyline3d без использования транзакции
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
К примеру нужно получить ссылки на 10 000 на примитивов.
Зачем? Они тебе нужны все вместе одновременно или ты с ними работаешь последовательно?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Зачем? Они тебе нужны все вместе одновременно или ты с ними работаешь последовательно?
По разному бывает нужно прочитать информацию некоторой локальной части чертежа, а бывает что нужно загрузить сразу в зависимости от задач пользователя.
Что касается открытия и завершения транзакции
1) при каждой итерации или только в
2) только в начале в начале и в конце цикла,
 то 2) способ работает ясно быстрее.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
По разному бывает нужно прочитать информацию некоторой локальной части чертежа, а бывает что нужно загрузить сразу в зависимости от задач пользователя.
Я не об этом спрашивал. Получив информацию из открытого примитива в 99% случаев ты переходишь к получению информации о следующем примитиве. В этом случае предыдущей очень желательно закрыть. Одним из исключений может быть случай получение пересечения двух примитивов - в этом случае два примитива должны быть открыты. Но мне неизвестны случаи, когда следует держать открытыми все (или часть) примитивов в чертеже.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение