Быстрая запись в 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