Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

Подскажите, пожалуйста.
Ситуация такая: нужно сохранять 2 таблицы:
table1 = {[1] = {id_a=<1..65535>, numb=<1..8>, id_b=<1..65535>}, [2] = {id_a=<1..65535>, numb=<1..8>, id_b=<1..65535>} ...}
table2 = {[1] = {id=<1..65535>, c=<1..1000> }, [2] = {id=<1..65535>, c=<1..1000> } ...}
Запас по числу элементов [1],[2]... желательно 40+.
Пробовал использовать функции amk.save_table, amk.load_table. Я так понимаю, они переводят таблицы в строку, затем обратно.
По мере заполнения таблиц получаю либо зависание при сохранении, либо вылет при попытке загрузки (чаще).
С нет-пакетами знаком плохо.
Может есть другие готовые и более подходящие функции для хранения таблиц? Или можно на упомянутых как-то по-другому организовать таблицы (разбить, исключить подтаблицы...)?
Или, если единственный вариант - разбираться с нет-пакетами, - подскажите, какие функции и где (из каких модов) посмотреть.
Спасибо.

Поделиться этим сообщением


Ссылка на сообщение

 malandrinus, спасибо за ответ.

Немного поэкспериментировал, сначала выкинул из таблиц стринговые секции - вылеты стали реже. Потом вообще исключил подтаблицы и сделал 5 отдельных таблиц, немного save/load - пока вроде не было вылетов, но может только пока...

Вообще, нет ли каких недостатков именно у этих amk-шных функций сохранения таблиц? Может есть другие, более надежные функции, поскольку вылет, так понимаю, именно из-за переполнения 8кб ?

Спасибо.

Изменено пользователем OFF_ender

Поделиться этим сообщением


Ссылка на сообщение

 Gun12, <1..65535> - id об'екта, я так понимаю, он в этих пределах. В общем в таблицах важны только числовые значения. По возможности стринги можно исключить. (писал в лс - буду благодарен за твой вариант)

Изменено пользователем OFF_ender

Поделиться этим сообщением


Ссылка на сообщение

Artos, спасибо. Да, как-то попадался ваш пост:

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

Раз уж возникла нужда в нетпакетах, то придется видимо разбираться серьезно.

Изменено пользователем OFF_ender

Поделиться этим сообщением


Ссылка на сообщение

Gun12, спасибо

В твоём примере я стрингов не видел.

Я имел ввиду ключи: id_a, id_b, numb. Если их совсем исключить и сделать таблицу вида:
table1 = {[1] = <1..65534>, [2]=<1..8>, [3]=<1..65535>, [4] = <1..65534>, [5]=<1..8>, [6]=<1..65535>,...}, тогда в ней прошлая 1-я подтаблица - это элементы [1],[2],[3], следующая - [4],[5],[6] и т.д. Надёжность в таком варианте не пострадает? Всё-таки раньше обращались к конкретному ключу конкретной подтаблицы, а здесь если выпадет один элемент, то всё сместится и посыпется... А также выигрыш по размеру пакета будет существенный?
Имеет ли смысл записывать только одну таблицу, если ко второй ещё не обращались? В твоём варианте сохраняются сразу обе, или особой разницы нет?

И ещё: 8кб - это общий размер всех сохраняемых данных или размер каждого пакета в отдельности?

Изменено пользователем OFF_ender

Поделиться этим сообщением


Ссылка на сообщение

Gun12, если тебе не сложно, я только за.

Кстати, если numb [1..1000] загнать в диапазон 1..100, я так понимаю, еще по одному байту экономиться будет? Можно конечно еще извернуться, и сохранять в таблице не id об'ектов, а индексы 1,2,3,... но наверно уж слишком много вычислений будет производиться при каждом действии...

Изменено пользователем OFF_ender

Поделиться этим сообщением


Ссылка на сообщение

Gun12, может я что-то недопонял...

Есть table1 с несколькими элемнентами
-- производим нужные действия с элементами. дальше:
for i=1,#table1 do
	table1[i].id_a = to100(table1[i].id_a)
	table1[i].numb = to100(table1[i].id_numb)
	table1[i].id_b = to100(table1[i].id_
end
s = toString(table1)
-- сохраняем строку каким-то образом в нет-пакет
...
-- читаем из нет-пакета строку s
table1 = toTable(s)[1]
for i=1,#table1 do
	table1[i].id_a = to10(table1[i].id_a)
	table1[i].numb = to10(table1[i].id_numb)
	table1[i].id_b = to10(table1[i].id_
end
-- получили первоначальный вид таблицы

Смысл в том, чтобы после конвертации в символы расходовалось меньше байт?

 

 

Поделиться этим сообщением


Ссылка на сообщение

Gun12, только сейчас добрался до твоего 2-го экономного варианта конвертации таблиц в строку (первый работает без проблем). Сначала не мог понять, почему пропускаются проверки элементов извлеченных таблиц, вроде бы внешний вид такой же, как и до преобразования в строку... Оказалось, на выходе toTable получаем стринги (как я понял). Наверное, где-то не хватает tonumber или ещё чего. Подскажи, плиз.

Поделиться этим сообщением


Ссылка на сообщение

Gun12, я уже пробовал вставлять tonumber, но на выходе большие числа были не те, что записывались в строку. Если я всё правильно вставил, то последнее твоё решение не помогло. Может дело во втором аргументе в tonumber(x, y) ?

Изменено пользователем OFF_ender

Поделиться этим сообщением


Ссылка на сообщение

Gun12, попробовал поставить девятку. Результат не изменился. К примеру загоняю в строку: table1 = { [1]={id=5000,s=1,art=100} }. На выходе имеем: { [1]={id=800,s=1,art=160} }

Может конечно это у меня что-то не так сростается... но 1-й вариант ведь работает... В любом случае спасибо за помощь!

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   1 пользователь

×
×
  • Создать...