Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Алексей (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 раз.
-
А зачем стартовать транзакцию для каждого примитива? Почему не один раз для всех?
http://bushman-andrey.blogspot.ru/2013/01/database-autocad.html
-
Просто хочу услышать мнение экспертов.
У меня к примеру файл 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 раз быстрее.
-
Есть ли возможность получить getObj не используя объект транзакции?
Да. Пример: Создание Polyline3d без использования транзакции (http://adn-cis.org/sozdanie-polyline3d-bez-ispolzovaniya-tranzakczii.html)
-
К примеру нужно получить ссылки на 10 000 на примитивов.
Зачем? Они тебе нужны все вместе одновременно или ты с ними работаешь последовательно?
-
Зачем? Они тебе нужны все вместе одновременно или ты с ними работаешь последовательно?
По разному бывает нужно прочитать информацию некоторой локальной части чертежа, а бывает что нужно загрузить сразу в зависимости от задач пользователя.
Что касается открытия и завершения транзакции
1) при каждой итерации или только в
2) только в начале в начале и в конце цикла,
то 2) способ работает ясно быстрее.
-
По разному бывает нужно прочитать информацию некоторой локальной части чертежа, а бывает что нужно загрузить сразу в зависимости от задач пользователя.
Я не об этом спрашивал. Получив информацию из открытого примитива в 99% случаев ты переходишь к получению информации о следующем примитиве. В этом случае предыдущей очень желательно закрыть. Одним из исключений может быть случай получение пересечения двух примитивов - в этом случае два примитива должны быть открыты. Но мне неизвестны случаи, когда следует держать открытыми все (или часть) примитивов в чертеже.