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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «VBScript крайне медленно работает со строками. Если пытаться сформировать JSON файл склеивая …»)
 
Строка 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
Персональные инструменты
Пространства имён

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