Быстрая запись в JSON файл
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) |
||
| Строка 5: | Строка 5: | ||
<syntaxhighlight lang="vbnet"> | <syntaxhighlight lang="vbnet"> | ||
Option Explicit | Option Explicit | ||
| − | Sub | + | 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 выборки, томожно воспользоваться встроенным методом 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:22, 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