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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
 
Строка 53: Строка 53:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Если стоит задача записать в JSON файл результат SQL выборки, томожно воспользоваться встроенным методом System.Dataset2JSON, который на порядок быстрее чем VBScript код:
+
Если стоит задача записать в JSON файл результат SQL выборки, томожно воспользоваться встроенным методом [[Gedemin_TLB.IGedemin.Dataset2JSON|System.Dataset2JSON]], который на порядок быстрее чем VBScript код:
  
 
<syntaxhighlight lang="vbnet">
 
<syntaxhighlight lang="vbnet">

Текущая версия на 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
Персональные инструменты
Пространства имён

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