(изменено: Slava.Coder.Vrn, 6 сентября 2007г. 23:32:54)

Тема: Загадка TDMSObject.Content.Create

Потребовалось сделать импорт большого количества объектов из таблицы Excel (порядка 80000) в пустую настройку TDMS.
Перед таким ответственным делом решил провести оценку требуемого времени.
TDMS 3.0.99, база на локальном MSDE (возможно, это важно)
Проверку осуществлял из макроса Excel:

Sub ttt()
  Dim TDMSApp As TDMS.TDMSApplication
  Dim RootObj As TDMSObject
  Dim Obj As TDMSObject
  Dim i As Integer
  Dim Times() As Single
  
  Set TDMSApp = GetObject(, "TDMS.Application")
  If Err <> 0 Then
    MsgBox Err.Description
    Exit Sub
  End If

  ReDim Times(500)
  Set RootObj = TDMSApp.GetObjectByGUID("{B65E9778-8C7C-43FB-B633-1CB8AE053AB3}")
  Times(0) = Timer()
  For i = 1 To 500
    Set Obj = RootObj.Content.Create("OBJ_Test")
    Obj.Attributes("ATTR_NameUn").Value = "Obj # " & CStr(i)
    If (i Mod 10 = 0) Then
      Times(i \ 10) = Timer()
    End If
  Next i
  
  For i = 1 To 500
    Application.ActiveSheet.Cells(i + 2, 2) = Times(i) - Times(0)
  Next i
End Sub

Изначально в настройке было всего несколько объектов (ок 20).
Первый тест - создание приведенной выше процедурой 500 объектов
Перед 2-м тестом перезапустил TDMS и Excel (на всякий) и создал еще 500 объектов
Перед 3-м тестом удалил последние созданные 500 объектов и еще раз запустил создание 500 объектов
На графиках показаны результаты. Временные "засечки" - каждые 10 созданных объектов
1-й график показывает время от начала операции
2-й график показывает время, затраченное на создание каждой 10-ки объектов (начиная со 2-го десятка)
На графиках хорошо наблюдается почти равномерное увеличение времени, требуемого на создание каждого последующего объекта.
Собственно, экстраполяция для 80000 объектов дала крайне обескураживающий результат.
С чем может быть связано такое нехорошее поведение TDMS?

Загадка TDMSObject.Content.Create

Загадка TDMSObject.Content.Create

Re: Загадка TDMSObject.Content.Create

Да, еще имеются какие-то локальные замедления при создании объектов, причем тоже повторяющиеся с почти постоянным периодом.
Это хорошо видно на прикрепленном графике, который показывает время, затраченное на создание каждого объекта из 500

Загадка TDMSObject.Content.Create

(изменено: Anatoly, 7 сентября 2007г. 11:20:49)

Re: Загадка TDMSObject.Content.Create

Слава, посмотри пожалуйста тему - мы там уже обсуждали:

https://tdmsforum.ru/topic30.html

Тут полностью аналогичная ситуация. Ты каждый раз запрашиваешь коллекцию - поэтому линейно растёт время.
вот тут:

Set Obj = RootObj.Content.

Re: Загадка TDMSObject.Content.Create

Семен-Семеныч!!!!
Я еще вчера подумал "Надо бы взять коллекцию Content перед циклом, а то каждый раз к ней обращаюсь, время лишнее тратится. Ладно, не критично, потом попробую".
Я ошибался, это на самом деле и есть причина замедления при добавлении объектов!

Загадка TDMSObject.Content.Create

(изменено: teem0n, 7 ноября 2011г. 13:35:42)

Re: Загадка TDMSObject.Content.Create

Slava.Coder.Vrn пишет:
Sub ttt()
  Dim TDMSApp As TDMS.TDMSApplication
  Dim RootObj As TDMSObject
  Dim Obj As TDMSObject
  Dim i As Integer
  Dim Times() As Single
  
  Set TDMSApp = GetObject(, "TDMS.Application")
  
End Sub

Использую вышеприведенный код.
Библиотеку подключил.
Ругается на строчке "Set TDMSApp = GetObject(, "TDMS.Application")" словами "ActiveX component can't create object".
Система х64.
Что может быть не так?

Re: Загадка TDMSObject.Content.Create

teem0n пишет:

Использую вышеприведенный код.
Библиотеку подключил.
Ругается на строчке "Set TDMSApp = GetObject(, "TDMS.Application")" словами "ActiveX component can't create object".
Система х64.
Что может быть не так?

ТДМС 4-ка? если да то стоит попробовать "TDMS.Application.4"

(изменено: teem0n, 8 ноября 2011г. 08:31:34)

Re: Загадка TDMSObject.Content.Create

vorona пишет:

ТДМС 4-ка? если да то стоит попробовать "TDMS.Application.4"

Да, 4.106. С "TDMS.Application.4" та же ситуация  :(

Re: Загадка TDMSObject.Content.Create

А тдмс в этот момент запущен ?
Можно попробовать

Set tdmApp = CreateObject("TDMS.Application")

Re: Загадка TDMSObject.Content.Create

Edhunter пишет:

А тдмс в этот момент запущен ?
Можно попробовать

Set tdmApp = CreateObject("TDMS.Application")

Я и так и так пробовал:

Dim TDMSApp As TDMS.TDMSApplication

Set TDMSApp = GetObject(, "TDMS.Application.4") 'CreateObject("TDMS.Application.4")

При запущенном - Get, при выключенном - Create.