Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Сохранение/загрузка lua таблицы. Сериализация.
DarkMaster
сообщение 10.4.2021, 12:02
Сообщение #1


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27679
Пользователь №: 11.279



Модулей по сериализации просто вагон, но один без руки, второй без ноги, третий спотыкается.
Собственно конкретно этот модуль для меня оказался наиболее адекватным в использовании. В частности у него есть нормальная поддержка таблиц ссылающихся друг на друга. Тем не менее модуль был кардинально переработан (добавлены 2 строчки) чтобы не падал видя cdata. Не стоит ожидать, что он сделает дампы cdata, но по крайней мере не падает.

--[[ Provides ]]
-- persistence.store(path, ...): Stores arbitrary items to the file at the given path
-- persistence.load(path): Loads files that were previously stored with store and returns them

--[[ Limitations ]]
-- Does not export userdata, threads or most function values
-- Function export is not portable

Сообщение отредактировал DarkMaster - 4.5.2021, 16:12


Прикрепленные файлы
Прикрепленный файл  persistence.lua ( 5,5 килобайт ) Кол-во скачиваний: 124


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 10.4.2021, 15:07
Сообщение #2


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8423
Пользователь №: 19.451
Возраст: 32



Цитата(DarkMaster @ 10.4.2021, 12:02) *

Модулей по сериализации просто вагон, но один без руки, второй без ноги, третий спотыкается.
Собственно конкретно этот модуль для меня оказался наиболее адекватным в использовании. В частности у него есть нормальная поддержка таблиц ссылающихся друг на друга. Тем не менее модуль был кардинально переработан (добавлены 2 строчки) чтобы не падал видя cdata. Не стоит ожидать, что он сделает дампы cdata, но по крайней мере не падает.

--[[ Provides ]]
-- persistence.store(path, ...): Stores arbitrary items to the file at the given path
-- persistence.load(path): Loads files that were previously stored with store and returns them

--[[ Limitations ]]
-- Does not export userdata, threads or most function values
-- Function export is not portable

Прикольно, актуальный вопрос в последнее время, а че по скорости?)
P.S.: я как то к cjson привык)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.4.2021, 15:36
Сообщение #3


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27679
Пользователь №: 11.279



Цитата
Прикольно, актуальный вопрос в последнее время, а че по скорости?)

Не тестил особо. Обычно подобная подгрузка происходит либо в начале и там пофигу сколько оно будет инициализироваться 0.1 или 2 секунды. Не те объемы. То, что нужно сохранять по ходу дела, чтобы потом восстановить прогресс, я обычно сохраняю в отдельные файлики (типа номера позиции в переборе чего-либо).
Вообще лично от себя скажу, что конкретно в этой реализации скорость должна быть плохой ибо там очень много операций '..' - это очень хреновая идея. Остальное нормально не работает либо выкидывает куски таблиц, либо уходит в бесконечные рекурсии.

Сообщение отредактировал DarkMaster - 10.4.2021, 15:39


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 10.4.2021, 15:43
Сообщение #4


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8423
Пользователь №: 19.451
Возраст: 32



Цитата(DarkMaster @ 10.4.2021, 15:36) *

Не тестил особо. Обычно подобная подгрузка происходит либо в начале и там пофигу сколько оно будет инициализироваться 0.1 или 2 секунды. Не те объемы. То, что нужно сохранять по ходу дела, чтобы потом восстановить прогресс, я обычно сохраняю в отдельные файлики (типа номера позиции в переборе чего-либо).
Вообще лично от себя скажу, что конкретно в этой реализации скорость должна быть плохой ибо там очень много операций '..' - это очень хреновая идея. Остальное нормально не работает либо выкидывает куски таблиц, либо уходит в бесконечные рекурсии.

Понял, сидим дальше на cjson`е (IMG:style_emoticons/default/smile.gif)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.4.2021, 15:45
Сообщение #5


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27679
Пользователь №: 11.279



Его сила в том, что он может нормально сохранить:
Код

local arr = {
    {11,12},
    2,
    "abc"
}
-- А теперь делаем подлость:
arr[4] = arr[1]
arr[1][3] = arr[4]
-- Т.е. у нас теперь циклический вызов, но он все это норм переварит.

Пример второй:
Код

local arr = {}
local sub = {1,2}
arr[1] = sub
arr[2] = sub
Он сохранит sub, как ОДИН массив, а не как два отдельных.
Т.е. он сохранит структуру.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.4.2021, 15:55
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27679
Пользователь №: 11.279



Ну и оно хотя бы нативно читаемым остается)
Если по скорости сохранения могут быть вопросы, то загрузка быстрее в любом случае будет тут либо в подобных модулях, т.к. на выходе мы получаем нативный lua код - его преобразовывать более не надо, а вот json придется еще приводить к луа.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 10.4.2021, 15:59
Сообщение #7


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8423
Пользователь №: 19.451
Возраст: 32



Цитата(DarkMaster @ 10.4.2021, 15:55) *

Ну и оно хотя бы нативно читаемым остается)
Если по скорости сохранения могут быть вопросы, то загрузка быстрее в любом случае будет тут либо в подобных модулях, т.к. на выходе мы получаем нативный lua код - его преобразовывать более не надо, а вот json придется еще приводить к луа.

Есть у меня json на 43к записей, надо потестить)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 10.4.2021, 16:29
Сообщение #8


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8423
Пользователь №: 19.451
Возраст: 32



Ну не плохо в принципе, читабельность на уровне)
json 43k записей 5,5mb
cjson чтение 0.089000000007218
cjson запись 0.13400000000547
persistence чтение 0.17900000000373
persistence запись 0.58600000001024
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.4.2021, 16:48
Сообщение #9


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27679
Пользователь №: 11.279



Цитата
Есть у меня json на 43к записей, надо потестить)

Было бы интересно. Есть еще пара интересных релаизаций, но там без фантазий нужно подходить. Подобные подставы там не стоит влеплять)
serpent вообще задуман как принтер и есть классные у него форматы вывода. Результат запихиваем в переменную, потом пишем ее на диск. Ничего сильно не меняется.
Код

local s = serpent.block(arr)
local f = io.open([[image\!catch.lua]], "wb")
f:write("local t = ") --если используется serpent.dump - убери эту строку
f:write(s)
f:write("\nreturn t") --если используется serpent.dump - убери эту строку
f:close()


local s = loadfile ([[image\!catch.lua]])()
log(tostring(s))


dump заявлен, как шустрый с большими объемами данных.

Больше всего serpent интересует. Там миллион форматов вывода, когда-то тестил, но объема толком не было, а генерированный сомнителен. Разница в скорости в зависимости от формата была приличная.


Прикрепленные файлы
Прикрепленный файл  serpent.lua ( 21,98 килобайт ) Кол-во скачиваний: 101
Прикрепленный файл  dump.lua ( 21,65 килобайт ) Кол-во скачиваний: 100


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 10.4.2021, 17:11
Сообщение #10


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8423
Пользователь №: 19.451
Возраст: 32



Цитата(DarkMaster @ 10.4.2021, 16:48) *

dump заявлен, как шустрый с большими объемами данных.

Больше всего serpent интересует. Там миллион форматов вывода, когда-то тестил, но объема толком не было, а генерированный сомнителен. Разница в скорости в зависимости от формата была приличная.

serpent.block запись 3.0179999999964
serpent.dump запись 1.7490000000107
serpent.line запись 2.9130000000005
loadfile 0.15000000000873
dump запись 1.051999999996
dump чтение 0.23400000001129

Код
local s = loadfile (path)
log(tostring(s))

nil выдает хз почему dofile норм отрабатывает

persistence выходит быстрее, cjson вне конкуренции, но читабельность хромает, хотя если открывать в браузере то все норм, ток с таким объемом браузер подвисает)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.4.2021, 18:26
Сообщение #11


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27679
Пользователь №: 11.279



Забавно. Вообще в луа, если стоит задача записать много данных и шустро, то есть пара правил:
1) Не вызывать write сильно часто. Его вызовы реально садят скорость, писать надо блоками.
2) Не использовать '..' ибо тормоз. Правльным вариантом будет добавление каждого нового элемента в массив, потом table.concat - скорость намного выше.

Т.е. в правильном виде надо было все в некоторый буфер-массив скидывать, а после обработки элемента проверять не слишком ли буфер разжирел. Если буфер толстый, то скидываем в файл. Скорости реально добавить должно.

Самым удивительным для меня оказалось то, что парсинг из json и пуш в луа оказался быстрее прямой загрузки луа файла.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 10.4.2021, 19:20
Сообщение #12


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8423
Пользователь №: 19.451
Возраст: 32



Цитата(DarkMaster @ 10.4.2021, 18:26) *

Самым удивительным для меня оказалось то, что парсинг из json и пуш в луа оказался быстрее прямой загрузки луа файла.

Там josn json`у рознь. По бенчмаркам самый шустрый cjson
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 10.4.2021, 19:32
Сообщение #13


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8423
Пользователь №: 19.451
Возраст: 32



Цитата(DarkMaster @ 10.4.2021, 18:26) *

1) Не вызывать write сильно часто. Его вызовы реально садят скорость, писать надо блоками.

С этим сталкивался, ощутил так сказать на своей шкуре
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 11.4.2021, 12:19
Сообщение #14


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2399
Пользователь №: 18.746



Цитата(Madeus @ 10.4.2021, 15:59) *

Есть у меня json на 43к записей

Можешь закинуть сюда, или в телегу прислать этот файл?
Если там нет ничего секретного (IMG:style_emoticons/default/smile.gif)
Может пригодиться для всяких тестов


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 11.4.2021, 16:54
Сообщение #15


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8423
Пользователь №: 19.451
Возраст: 32



Цитата(Fors1k @ 11.4.2021, 12:19) *

Можешь закинуть сюда, или в телегу прислать этот файл?
Если там нет ничего секретного (IMG:style_emoticons/default/smile.gif)
Может пригодиться для всяких тестов

Не могу) надо будет потестить пиши
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 12.4.2021, 0:23
Сообщение #16


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2399
Пользователь №: 18.746



Цитата(Madeus @ 11.4.2021, 16:54) *

Не могу)

Ну, видимо, файл с важными данными)

Я тут подумал, а чего бы тогда самому не сделать json файл?
Если кому пригодится создание json файла любого размера и наполнения, то сейчас расскажу что я выяснил на этот счет.

Ранее с json я особо не пересекался. Как я понял, это есть массив хэш-таблиц. Возможно оно не совсем так, но для создания болванки, такого понимания нам будет достаточно.
Хэш-таблица - это, проще говоря, такой массив данных, где есть ключ и его значение.
Вот так выглядит создание хэш-таблицы:
$table = @{
name
= "Коля"
age
= 25
}

Так, с hashtable понятно, теперь нам нужен массив, в который мы будем писать таблицы.
У массива размер изменять нельзя.
Так что мы воспользуемся типом данных "коллекция". У коллекций размер не фиксируется в момент создания, и в нее можно спокойно добавлять элементы через метод Add() .

Итак, мы определились с набором инструментов, можно приступать.
План такой:
1. инициализируем коллекцию
2. через цикл for добавим в нее несколько тысяч записей, например, клиентов банка
3. переведем массив таблиц в json формат
4. запишем в файл
так будет выглядеть файл
Код
[
    {
        "Name":  "Client_1",
        "Age":  30,
        "Money":  3318,
        "Address":  {
                        "Country":  "Russia",
                        "City":  "Moscow"
                    }
    },
    {
        "Name":  "Client_2",
        "Age":  35,
        "Money":  4537,
        "Address":  {
                        "Country":  "Russia",
                        "City":  "Moscow"
                    }
    }
]

Пишем:
--lua
log"clear";log"mode compact";require"luaposh"

PScode('r',{[[#}
$path = "D:\files\test.json"

$data = [Collections.ArrayList]::new()

for($i = 1; $i -le 10000; $i++){#}
[void]$data.Add(
@{
#}
Name
= "Client_$i"
Money
= Get-Random -Maximum 5000
Age
= Get-Random -Minimum 18 -Maximum 65
Address
= @{#}
Country
= "Russia"
City
= "Moscow"
}
}
)
}

$json = $data|ConvertTo-Json
Set-Content $path $json
Log "Готово"
]]})


Теперь прочитаем данные из json файла.
Тут все просто. Читаем файл, и командой ConvertFrom-Json конвертируем прочитанное в набор понятных объектов.
--lua
log"clear";log"mode compact";require"luaposh"

PScode('void',{[[#}
#
$clients = Get-Content -raw "D:\files\test.json" | ConvertFrom-Json

$clients[0..19]|Out-GridView -Title "Клиенты из Москвы"
#
]]})


Тут еще использована интересная команда Out-GridView, которая покажет нам данные в таком удобном виде:
(информация о первых 20 клиентах)
Прикрепленное изображение

В общем, кому понадобится создать болванку большого json файла, можете пользоваться)


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 18.4.2024, 11:12
Designed by Nickostyle