Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сохранение JSON объекта / 13 сообщений из 13, страница 1 из 1
31.10.2018, 00:11
    #39725378
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
При попытке сохранить большой JSON объект (40+ мбайт данных)
Код: pascal
1.
SL.Add(TJson.Format(JObject));


выскакивает ошибка out of memory.
Кто нибудь сталкивался, как решить?
...
Рейтинг: 0 / 0
31.10.2018, 00:17
    #39725382
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
Miracle940+ мбайт данных
Где, чего, когда ... Могли перед этим вызовом быть 1.5 гиг текста загружены ...
Лучше пример кода привести.
...
Рейтинг: 0 / 0
31.10.2018, 00:22
    #39725384
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
При закрытии формы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
procedure TFMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
  SL: TStringList;
  JObject: TJSONObject;
  ToolArray: TJSONArray;
  ToolObject: TJSONObject;

  DataArray: TJSONArray;
  DataObject: TJSONObject;

  i, j: integer;
begin
  SL := TStringList.Create;
  try
    JObject := TJSONObject.Create;
    if (Tools.Count > 0) then
    begin
      ToolArray := TJSONArray.Create;
      for i := 0 to Tools.Count - 1 do
      begin
        ToolObject := TJSONObject.Create;
        ToolObject.AddPair('name', TJSONString.Create(Tools[i].name));
        ToolObject.AddPair('symbol', TJSONString.Create(Tools[i].symbol));
        ToolObject.AddPair('link', TJSONString.Create(Tools[i].link));

        if (Tools[i].Data.Count > 0) then
        begin
          DataArray := TJSONArray.Create;
          for j := 0 to Tools[i].Data.Count - 1 do
          begin
            DataObject := TJSONObject.Create;
            DataObject.AddPair('date', TJSONNumber.Create(Tools[i].Data[j].Date));
            DataObject.AddPair('open', TJSONNumber.Create(Tools[i].Data[j].Open));
            DataObject.AddPair('high', TJSONNumber.Create(Tools[i].Data[j].high));
            DataObject.AddPair('low', TJSONNumber.Create(Tools[i].Data[j].low));
            DataObject.AddPair('close', TJSONNumber.Create(Tools[i].Data[j].close));
            DataArray.AddElement(DataObject);
          end;
          ToolObject.AddPair('Data', DataArray);
        end;
        ToolArray.AddElement(ToolObject);
      end;
      JObject.AddPair('Tools', ToolArray);
    end;

    SL.Add(TJson.Format(JObject));
    SL.SaveToFile(ExtractFilePath(Application.ExeName) + 'DATA.json');
  finally
    FreeAndNil(SL);
    FreeAndNil(JObject);
  end;
end;
...
Рейтинг: 0 / 0
31.10.2018, 00:29
    #39725386
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
Miracle9,

а зачем ты строку, которую возвращает Format(), перед сохранением в TStringList загоняешь?
...
Рейтинг: 0 / 0
31.10.2018, 00:34
    #39725388
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
TJsonTextWriter
...
Рейтинг: 0 / 0
31.10.2018, 01:02
    #39725400
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
КотовасияMiracle9,

а зачем ты строку, которую возвращает Format(), перед сохранением в TStringList загоняешь?
Чтобы сохранить её в файл.
...
Рейтинг: 0 / 0
31.10.2018, 01:30
    #39725416
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
Miracle9,

а по-другому - никак, только после копирования в стриглист?

Ты хоть проверь, доходит ли дело до формирования выходной строки. Может, у тебя все на Format() падает.
Почему не используешь superobject, если такой ленивый. Там и в файл, и в поток сохранение есть, и быдлокодить в два раза меньше.
...
Рейтинг: 0 / 0
31.10.2018, 01:43
    #39725420
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
КотовасияMiracle9,

а по-другому - никак, только после копирования в стриглист?

Ты хоть проверь, доходит ли дело до формирования выходной строки. Может, у тебя все на Format() падает.
Почему не используешь superobject, если такой ленивый. Там и в файл, и в поток сохранение есть, и быдлокодить в два раза меньше.
Пробавал без Format() тоже самое.
Меня обычный JSON устраивал, всё что нужно есть.
А на счёт "быдлокодить", какие в интернете статьи такие и кодеры :)
Спасибо Дмитрию за TJsonTextWriter. Прикольная вещь. Думаю буду теперь её использовать.
...
Рейтинг: 0 / 0
31.10.2018, 03:15
    #39725428
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
Miracle9,

что ты "без Format" пробовал?
...
Рейтинг: 0 / 0
31.10.2018, 16:05
    #39725955
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
Переделал я код, проблема осталась - out of memory
Если при сохранении файл получается меньше 80мб всё ок, больше ошибка

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
procedure TFMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i, j: integer;
  StringWriter: TStringWriter;
  Writer: TJsonTextWriter;
  SW: TStreamWriter;
begin
  SW := TStreamWriter.Create(ExtractFilePath(Application.ExeName) + 'DATA.json', False, TEncoding.UTF8);
  StringWriter := TStringWriter.Create;
  Writer := TJsonTextWriter.Create(StringWriter);
  try
    Writer.Formatting := TJsonFormatting.Indented;

    Writer.WriteStartObject;
    if (Tools.Count > 0) then
    begin
      Writer.WritePropertyName('Tools');
      Writer.WriteStartArray;
      for i := 0 to Tools.Count - 1 do
      begin
        Writer.WriteStartObject;
        Writer.WritePropertyName('name');
        Writer.WriteValue(Tools[i].name);
        Writer.WritePropertyName('symbol');
        Writer.WriteValue(Tools[i].symbol);
        Writer.WritePropertyName('link');
        Writer.WriteValue(Tools[i].link);
        if (Tools[i].Data.Count > 0) then
        begin
          Writer.WritePropertyName('Data');
          Writer.WriteStartArray;
          for j := 0 to Tools[i].Data.Count - 1 do
          begin
            Writer.WriteStartObject;
            Writer.WritePropertyName('date');
            Writer.WriteValue(DateToStr(Tools[i].Data[j].Date));
            Writer.WritePropertyName('open');
            Writer.WriteValue(Tools[i].Data[j].open);
            Writer.WritePropertyName('high');
            Writer.WriteValue(Tools[i].Data[j].open);
            Writer.WritePropertyName('low');
            Writer.WriteValue(Tools[i].Data[j].low);
            Writer.WritePropertyName('close');
            Writer.WriteValue(Tools[i].Data[j].close);
            Writer.WriteEndObject;
          end;
          Writer.WriteEndArray;
        end;
        Writer.WriteEndObject;
      end;
      Writer.WriteEndArray;
    end;
    Writer.WriteEndObject;

    SW.WriteLine(StringWriter.ToString);
  finally
    FreeAndNil(Writer);
    FreeAndNil(StringWriter);
    FreeAndNil(SW);
  end;
end;
...
Рейтинг: 0 / 0
31.10.2018, 16:18
    #39725977
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
Miracle9,

глянь память, что вообще происходит. возможно что её на самом деле не хватает.
можно порекомендовать библиотеки для замены: SuperObject, XSuperObject.
...
Рейтинг: 0 / 0
31.10.2018, 16:38
    #39725983
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
FS := TFileStream.Create(...);
SW := TStreamWriter.Create(FS);
JTW := TJsonTextWriter.Create(SW);
...
Рейтинг: 0 / 0
31.10.2018, 17:09
    #39726021
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение JSON объекта
Dmitry ArefievFS := TFileStream.Create(...);
SW := TStreamWriter.Create(FS);
JTW := TJsonTextWriter.Create(SW);
Спасибо Дмитрий, работает!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сохранение JSON объекта / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]