Быстрая запись в JSON файл

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
 
(не показана 1 промежуточная версия 1 участника)
Строка 5: Строка 5:
 
<syntaxhighlight lang="vbnet">
 
<syntaxhighlight lang="vbnet">
 
Option Explicit
 
Option Explicit
Sub Macros350407620_1817739749
+
Sub ExportToJSON
  
 
   Const fmCreate = &HFFFF&
 
   Const fmCreate = &HFFFF&
Строка 50: Строка 50:
 
    
 
    
 
   MsgBox "Records: " & C & "  Time: " & (WinAPI.GetTickCount - T) & "ms"
 
   MsgBox "Records: " & C & "  Time: " & (WinAPI.GetTickCount - T) & "ms"
 +
End Sub
 +
</syntaxhighlight>
 +
 +
Если стоит задача записать в JSON файл результат SQL выборки, томожно воспользоваться встроенным методом [[Gedemin_TLB.IGedemin.Dataset2JSON|System.Dataset2JSON]], который на порядок быстрее чем VBScript код:
 +
 +
<syntaxhighlight lang="vbnet">
 +
Sub ExportToJSON2
 +
 +
  Const fmCreate = &HFFFF&
 +
  Const FileName = "c:\temp\test.json"
 +
 +
  Dim FS, Creator, T
 +
 +
  T = WinAPI.GetTickCount
 +
 +
  Set Creator = New TCreator
 +
 +
  Dim q
 +
  Set q = Creator.GetObject(nil, "TIBSQL", "")
 +
  Set q.Transaction = gdcBaseManager.ReadTransaction
 +
  q.SQL.Text = "SELECT id, name, phone, fax, zip, country, district, city, address FROM gd_contact"
 +
  q.ExecQuery
 +
 +
  Set FS = Creator.GetObject(Array(FileName, fmCreate), "TFileStream", "")
 +
  Call System.Dataset2JSON(q, FS, "", "", 2, True)
 +
 +
  MsgBox "Time: " & (WinAPI.GetTickCount - T) & "ms"
 
End Sub
 
End Sub
 
</syntaxhighlight>
 
</syntaxhighlight>

Текущая версия на 17:35, 14 февраля 2022

VBScript крайне медленно работает со строками. Если пытаться сформировать JSON файл склеивая кусочки строк, то это может занять целую вечность. Гораздо быстрее можно добиться нужного результата, если использовать потоки в памяти. Ниже приведен код экспорта справочника контактов и запись его на диск на который можно ориентироваться как на предел по скорости, которую можно выжать из VBScript.

10.5 сек, 52 053 записей, размер файла: 14 646 604 байт.

Option Explicit
Sub ExportToJSON
 
  Const fmCreate = &HFFFF&
  Const FileName = "c:\temp\test.json"
 
  Dim MS, FS, Creator, T, C
 
  T = WinAPI.GetTickCount
  C = 0
 
  Set Creator = New TCreator
  Set MS = Creator.GetObject(nil, "TMemoryStream", "")
 
  Dim q
  Set q = Creator.GetObject(nil, "TIBSQL", "")
  Set q.Transaction = gdcBaseManager.ReadTransaction
  q.SQL.Text = "SELECT * FROM gd_contact"
  q.ExecQuery
 
  MS.WriteLn("[")
 
  While Not q.EOF
    MS.WriteLn("  {")
 
    MS.WriteLn("    ""id"": " + q.FieldByName("id").AsString + ",")
    MS.WriteLn("    ""name"": """ + Replace(q.FieldByName("name").AsString, """", "'") + """")
    MS.WriteLn("    ""phone"": """ + Replace(q.FieldByName("phone").AsString, """", "'") + """")
    MS.WriteLn("    ""fax"": """ + Replace(q.FieldByName("fax").AsString, """", "'") + """")
    MS.WriteLn("    ""zip"": """ + Replace(q.FieldByName("zip").AsString, """", "'") + """")
    MS.WriteLn("    ""country"": """ + Replace(q.FieldByName("country").AsString, """", "'") + """")
    MS.WriteLn("    ""district"": """ + Replace(q.FieldByName("district").AsString, """", "'") + """")
    MS.WriteLn("    ""city"": """ + Replace(q.FieldByName("city").AsString, """", "'") + """")
    MS.WriteLn("    ""address"": """ + Replace(q.FieldByName("address").AsString, """", "'") + """")
 
    MS.WriteLn("  }")
    C = C + 1
    q.Next
  WEnd
 
  MS.WriteLn("]")
 
  Set FS = Creator.GetObject(Array(FileName, fmCreate), "TFileStream", "")
  Call System.WIN1251ToUTF8(MS, FS)
 
  MsgBox "Records: " & C & "  Time: " & (WinAPI.GetTickCount - T) & "ms"
End Sub

Если стоит задача записать в JSON файл результат SQL выборки, томожно воспользоваться встроенным методом System.Dataset2JSON, который на порядок быстрее чем VBScript код:

Sub ExportToJSON2
 
  Const fmCreate = &HFFFF&
  Const FileName = "c:\temp\test.json"
 
  Dim FS, Creator, T
 
  T = WinAPI.GetTickCount
 
  Set Creator = New TCreator
 
  Dim q
  Set q = Creator.GetObject(nil, "TIBSQL", "")
  Set q.Transaction = gdcBaseManager.ReadTransaction
  q.SQL.Text = "SELECT id, name, phone, fax, zip, country, district, city, address FROM gd_contact"
  q.ExecQuery
 
  Set FS = Creator.GetObject(Array(FileName, fmCreate), "TFileStream", "")
  Call System.Dataset2JSON(q, FS, "", "", 2, True)
 
  MsgBox "Time: " & (WinAPI.GetTickCount - T) & "ms"
End Sub
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты