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

Материал из GedeminWiki
Перейти к: навигация, поиск

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

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