Быстрая запись в JSON файл
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) (Новая страница: «VBScript крайне медленно работает со строками. Если пытаться сформировать JSON файл склеивая …») |
SYSDBA (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
VBScript крайне медленно работает со строками. Если пытаться сформировать JSON файл склеивая кусочки строк, то это может занять целую вечность. Гораздо быстрее можно добиться нужного результата, если использовать потоки в памяти. Ниже приведен код экспорта справочника контактов и запись его на диск на который можно ориентироваться как на предел по скорости, которую можно выжать из VBScript. | VBScript крайне медленно работает со строками. Если пытаться сформировать JSON файл склеивая кусочки строк, то это может занять целую вечность. Гораздо быстрее можно добиться нужного результата, если использовать потоки в памяти. Ниже приведен код экспорта справочника контактов и запись его на диск на который можно ориентироваться как на предел по скорости, которую можно выжать из VBScript. | ||
| + | 10.5 сек, 52 053 записей, размер файла: 14 646 604 байт. | ||
<syntaxhighlight lang="vbnet"> | <syntaxhighlight lang="vbnet"> | ||
Версия 13:36, 14 февраля 2022
VBScript крайне медленно работает со строками. Если пытаться сформировать JSON файл склеивая кусочки строк, то это может занять целую вечность. Гораздо быстрее можно добиться нужного результата, если использовать потоки в памяти. Ниже приведен код экспорта справочника контактов и запись его на диск на который можно ориентироваться как на предел по скорости, которую можно выжать из VBScript.
10.5 сек, 52 053 записей, размер файла: 14 646 604 байт.
Option Explicit Sub Macros350407620_1817739749 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