OFF_ender 33 Опубликовано 14 Апреля 2013 Подскажите, пожалуйста.Ситуация такая: нужно сохранять 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. Я так понимаю, они переводят таблицы в строку, затем обратно.По мере заполнения таблиц получаю либо зависание при сохранении, либо вылет при попытке загрузки (чаще).С нет-пакетами знаком плохо.Может есть другие готовые и более подходящие функции для хранения таблиц? Или можно на упомянутых как-то по-другому организовать таблицы (разбить, исключить подтаблицы...)?Или, если единственный вариант - разбираться с нет-пакетами, - подскажите, какие функции и где (из каких модов) посмотреть.Спасибо. Поделиться этим сообщением Ссылка на сообщение
OFF_ender 33 Опубликовано 14 Апреля 2013 (изменено) malandrinus, спасибо за ответ. Немного поэкспериментировал, сначала выкинул из таблиц стринговые секции - вылеты стали реже. Потом вообще исключил подтаблицы и сделал 5 отдельных таблиц, немного save/load - пока вроде не было вылетов, но может только пока... Вообще, нет ли каких недостатков именно у этих amk-шных функций сохранения таблиц? Может есть другие, более надежные функции, поскольку вылет, так понимаю, именно из-за переполнения 8кб ? Спасибо. Изменено 14 Апреля 2013 пользователем OFF_ender Поделиться этим сообщением Ссылка на сообщение
OFF_ender 33 Опубликовано 14 Апреля 2013 (изменено) Gun12, <1..65535> - id об'екта, я так понимаю, он в этих пределах. В общем в таблицах важны только числовые значения. По возможности стринги можно исключить. (писал в лс - буду благодарен за твой вариант) Изменено 14 Апреля 2013 пользователем OFF_ender Поделиться этим сообщением Ссылка на сообщение
OFF_ender 33 Опубликовано 14 Апреля 2013 (изменено) Artos, спасибо. Да, как-то попадался ваш пост: "при осваивании нет-пакетов, советую отбросить все "дурные" привычки. Нет-пакеты требуют полного понимания "что, как и зачем" и не допускают любых вольностей иль гаданий при их использовании.". Раз уж возникла нужда в нетпакетах, то придется видимо разбираться серьезно. Изменено 14 Апреля 2013 пользователем OFF_ender Поделиться этим сообщением Ссылка на сообщение
OFF_ender 33 Опубликовано 15 Апреля 2013 (изменено) 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кб - это общий размер всех сохраняемых данных или размер каждого пакета в отдельности? Изменено 15 Апреля 2013 пользователем OFF_ender Поделиться этим сообщением Ссылка на сообщение
OFF_ender 33 Опубликовано 15 Апреля 2013 (изменено) Gun12, если тебе не сложно, я только за. Кстати, если numb [1..1000] загнать в диапазон 1..100, я так понимаю, еще по одному байту экономиться будет? Можно конечно еще извернуться, и сохранять в таблице не id об'ектов, а индексы 1,2,3,... но наверно уж слишком много вычислений будет производиться при каждом действии... Изменено 15 Апреля 2013 пользователем OFF_ender Поделиться этим сообщением Ссылка на сообщение
OFF_ender 33 Опубликовано 15 Апреля 2013 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 -- получили первоначальный вид таблицы Смысл в том, чтобы после конвертации в символы расходовалось меньше байт? Поделиться этим сообщением Ссылка на сообщение
OFF_ender 33 Опубликовано 17 Апреля 2013 Gun12, только сейчас добрался до твоего 2-го экономного варианта конвертации таблиц в строку (первый работает без проблем). Сначала не мог понять, почему пропускаются проверки элементов извлеченных таблиц, вроде бы внешний вид такой же, как и до преобразования в строку... Оказалось, на выходе toTable получаем стринги (как я понял). Наверное, где-то не хватает tonumber или ещё чего. Подскажи, плиз. Поделиться этим сообщением Ссылка на сообщение
OFF_ender 33 Опубликовано 17 Апреля 2013 (изменено) Gun12, я уже пробовал вставлять tonumber, но на выходе большие числа были не те, что записывались в строку. Если я всё правильно вставил, то последнее твоё решение не помогло. Может дело во втором аргументе в tonumber(x, y) ? Изменено 17 Апреля 2013 пользователем OFF_ender Поделиться этим сообщением Ссылка на сообщение
OFF_ender 33 Опубликовано 17 Апреля 2013 Gun12, попробовал поставить девятку. Результат не изменился. К примеру загоняю в строку: table1 = { [1]={id=5000,s=1,art=100} }. На выходе имеем: { [1]={id=800,s=1,art=160} } Может конечно это у меня что-то не так сростается... но 1-й вариант ведь работает... В любом случае спасибо за помощь! Поделиться этим сообщением Ссылка на сообщение