Comments 26
А какой смысл? Короче просто бинарного файла все равно не будет. Насколько я знаю, messagePack даёт возможность сериализации, но никакой новой структуры данных не даёт.
Если что-то готовое брать. Наверное лучше всего будет взять что-то типа структуры vector из проекта php-ds. Недавно натолкнулся, очень перспективно выглядит, там через php расширение, поэтому скорость, как у ракеты.
Я совсем не против msgpack и даже использую его для хранения файлового кеша. Если его можно использовать и в каком-то другом качестве — отлично. Но я так и не понял, что он будет делать в trie. У меня сейчас словарь записан в виде строки бинарных данных, если получится сделать компактнее, чем 154 байт на узел — это все равно будет строка бинарных данных, которая в ходе работы программы не становится массивом или объектом. Вот есть сущность словаря — узел, который состоит из маски и ссылок, которые просты куски по 3 байта. Что может msgpack? Сохранить на диск? Ок. А дальше? msgpack_unpack() даёт мне массив на 2гб? Или он может какой-то свой объект для хранения предложить? Эффективность — когда для хранения 10 байт я трачу 15. У меня сейчас неэффективно, потому что 400байт на 1 слово, весь словарь 150мб, но если я беру массив, то там ещё хуже с эффективностью.
Можно вместо 46 указателей хранить 1 указатель и все дочерние записи располагать подряд.
Выигрыш будет тем больше, чем полнее дерево.
ПС. Посчитал, выигрыш по памяти будет, даже если у родителя только 2 ребенка.
Да, отличная идея. Но места резервировать под всех возможных детей? Как бы этого не делать?
А теперь переписать это все на zephir и скомпилить в виде расширения. Интересно, на сколько выростет скорость?
1) Правильно ли я понимаю, что узлы хранятся в одном непрерывном блоке памяти? Тогда получается, что при вставке нового узла из-за добавления ссылки придется двигать какую-то часть этого блока?
2) Не совсем понятно, как работают ссылки через смещения. Опять же, узлы же должны двигаться?
Все верно, все в непрерывном блоке. Двигать ничего не приходится, потому что каждый узел имеет место для ссылок на всех возможных детей. Узел.маска.ссылки.Узел.маска.ссылки
Но вот сейчас начал пробовать по схеме с переменной длиной узла, когда свободного места не будет на всех детей. Сразу застрял. Как раз проблема с тем, что придётся менять адреса у других узлов, мало того, что это долго, так ещё непонятно как узнать кто является родителем узла.
Ссылки сейчас даже без смещения. Само смещение вычисляется из ссылки. Вот к примеру нужен узел с индексом 121. Считаем его смещение: offset = 121 * 154
В данной версии — скорость и простота. Сейчас переделываю немного, скорость будет чуть ниже, сложность чуть выше, а памяти будет жрать где-то в 13 раз меньше.
Надеюсь сумею переписать после на Си, если хорошо заработает. А эту либу оставлю как полифил.
Но скорость снизилась слишком сильно. 42.5 тыс. слов в секунду при поиске. Надо теперь точно сделать на Си. Что посоветуешь посмотреть по части Си расширений для PHP?
Низкоуровневая реализация префиксного дерева trie на PHP