Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 06-04-2016, 16:29:18

Название: Получить ссылку на примитив без транзакции
Отправлено: Алексей (IdeaSoft) от 06-04-2016, 16:29:18
У меня такой вопрос.
К примеру мне известен 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 раз.

 

Название: Re: Получить ссылку на примитив без транзакции
Отправлено: Александр Пекшев aka Modis от 06-04-2016, 16:36:12
А зачем стартовать транзакцию для каждого примитива? Почему не один раз для всех?

http://bushman-andrey.blogspot.ru/2013/01/database-autocad.html
Название: Re: Получить ссылку на примитив без транзакции
Отправлено: Алексей (IdeaSoft) от 06-04-2016, 17:07:15
Просто хочу услышать мнение экспертов.

У меня к примеру файл 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 раз быстрее.



 

 
Название: Re: Получить ссылку на примитив без транзакции
Отправлено: Александр Ривилис от 06-04-2016, 21:23:39
Есть ли возможность получить getObj не используя объект транзакции?
Да. Пример: Создание Polyline3d без использования транзакции (http://adn-cis.org/sozdanie-polyline3d-bez-ispolzovaniya-tranzakczii.html)
Название: Re: Получить ссылку на примитив без транзакции
Отправлено: Александр Ривилис от 06-04-2016, 21:26:50
К примеру нужно получить ссылки на 10 000 на примитивов.
Зачем? Они тебе нужны все вместе одновременно или ты с ними работаешь последовательно?
Название: Re: Получить ссылку на примитив без транзакции
Отправлено: Алексей (IdeaSoft) от 07-04-2016, 00:15:04
Зачем? Они тебе нужны все вместе одновременно или ты с ними работаешь последовательно?
По разному бывает нужно прочитать информацию некоторой локальной части чертежа, а бывает что нужно загрузить сразу в зависимости от задач пользователя.
Что касается открытия и завершения транзакции
1) при каждой итерации или только в
2) только в начале в начале и в конце цикла,
 то 2) способ работает ясно быстрее.
Название: Re: Получить ссылку на примитив без транзакции
Отправлено: Александр Ривилис от 07-04-2016, 08:45:30
По разному бывает нужно прочитать информацию некоторой локальной части чертежа, а бывает что нужно загрузить сразу в зависимости от задач пользователя.
Я не об этом спрашивал. Получив информацию из открытого примитива в 99% случаев ты переходишь к получению информации о следующем примитиве. В этом случае предыдущей очень желательно закрыть. Одним из исключений может быть случай получение пересечения двух примитивов - в этом случае два примитива должны быть открыты. Но мне неизвестны случаи, когда следует держать открытыми все (или часть) примитивов в чертеже.