Size: a a a

2021 January 11

SZ

Sergey Zhmylove in Modern::Perl
Andrey Konovalov
Если применительно к perl'у - наверное, можно сказать, что он сам по себе медленный, поэтому накладные расходы на хеш мизерные, но если универсально судить - поиск в 3-х хешах для программы на C - это дешёвая операция?
Да
источник

SZ

Sergey Zhmylove in Modern::Perl
Я как раз работаю в проекте, который на этом очень много денег сделал. И раньше я думал, что это слишком большой оверхед
источник

b

basiliscos in Modern::Perl
Andrey Konovalov
Товарищи! Нет ли возможности какой-то парсить JSON и YAML-конфиги в хеш, ключами которого являются конкатенированные последовательности наподобие JSON.Path?
Например,
{"data": {"creds": {"login": "jaja", "password": "nein"}}}
мог бы распарситься в хеш:
{
 'data.creds.login' => 'jaja',
 'data.creds.password' => 'nein'
}

Какие проблемы это решает?
1) Повышает быстродействие: доступ к $config{'data'}{'creds'}{'login'} в общем случае медленнее доступа к $config{'data.creds.login'}
2) Обеспечивает простой доступ к элементу по описанию пути к нему: используем реальный JSON.Path И не вынуждены рекурсивно обходить хеш в хеше в массиве в хеше для поиска какого-нибудь data.users.0.creds.password
3) Позволяет легко делать и загружать дампы подобных структур в виде набора пар ключ-значение

Какие проблемы создаёт:
1) Накладывает ограничения на имена полей: не позволяет использовать разделитель внутри имён полей. Например, нельзя назвать поле "foo.bar", если разделитель - точка.
2) Если много вложенных массивов и мало хешей - невыгодно с т.з. производительности
2) Длинные ключи в хеше
https://metacpan.org/pod/Data::Hash::DotNotation

но, афаик, жутко неэффективно
источник

SZ

Sergey Zhmylove in Modern::Perl
Andrey Konovalov
Товарищи! Нет ли возможности какой-то парсить JSON и YAML-конфиги в хеш, ключами которого являются конкатенированные последовательности наподобие JSON.Path?
Например,
{"data": {"creds": {"login": "jaja", "password": "nein"}}}
мог бы распарситься в хеш:
{
 'data.creds.login' => 'jaja',
 'data.creds.password' => 'nein'
}

Какие проблемы это решает?
1) Повышает быстродействие: доступ к $config{'data'}{'creds'}{'login'} в общем случае медленнее доступа к $config{'data.creds.login'}
2) Обеспечивает простой доступ к элементу по описанию пути к нему: используем реальный JSON.Path И не вынуждены рекурсивно обходить хеш в хеше в массиве в хеше для поиска какого-нибудь data.users.0.creds.password
3) Позволяет легко делать и загружать дампы подобных структур в виде набора пар ключ-значение

Какие проблемы создаёт:
1) Накладывает ограничения на имена полей: не позволяет использовать разделитель внутри имён полей. Например, нельзя назвать поле "foo.bar", если разделитель - точка.
2) Если много вложенных массивов и мало хешей - невыгодно с т.з. производительности
2) Длинные ключи в хеше
источник

SZ

Sergey Zhmylove in Modern::Perl
Сначала читаешь json/yaml имеющимися модулями, потом флатишь полученный nested hash и пользуешься
источник

AK

Andrey Konovalov in Modern::Perl
Надо ключи вложенных структур как последовательность префиксных деревьев замутить. Только не на Perl
источник

SZ

Sergey Zhmylove in Modern::Perl
Andrey Konovalov
Надо ключи вложенных структур как последовательность префиксных деревьев замутить. Только не на Perl
Ну как бы зачем?
источник

SZ

Sergey Zhmylove in Modern::Perl
Это всё равно будет медленно работать
источник

AK

Andrey Konovalov in Modern::Perl
Для ограниченного набора слов из ... лексиконов (слов, характерных для проблемной области) ветвлений при поиске очень мало, а иногда их и вовсе нет.
источник

AK

Andrey Konovalov in Modern::Perl
Поиск по trie столько зависит от количества ветвлений по пути
источник

AK

Andrey Konovalov in Modern::Perl
Если, например, ключ конфига на уровне N, начинающийся на букву "c" всего один - поиск в префиксном дереве будет намного быстрее, чем в хеше.
источник

SZ

Sergey Zhmylove in Modern::Perl
Ты меня не понял
источник

AK

Andrey Konovalov in Modern::Perl
Вероятность наличия в конфиге ключей в духе
code, cool, coalesce
- ещё ниже, вероятность наличия множества таких случаев - вообще исчезающе мала
источник

SZ

Sergey Zhmylove in Modern::Perl
Andrey Konovalov
Вероятность наличия в конфиге ключей в духе
code, cool, coalesce
- ещё ниже, вероятность наличия множества таких случаев - вообще исчезающе мала
источник

SZ

Sergey Zhmylove in Modern::Perl
Для перла это ненужно
источник

SZ

Sergey Zhmylove in Modern::Perl
Потому что оно всё равно будет через перлокод вызываться на стыке перла и си
источник

AK

Andrey Konovalov in Modern::Perl
Sergey Zhmylove
Ты меня не понял
С учётом того, что для расчёта индекса в хеше используется неконтролируемый пользователем алгоритм и с вероятностью 99% этот алгоритм использует все символы ключа - эффективная реализация trie для "лексиконов" будет быстрее хеширования
источник

VG

Vadim Goncharov in Modern::Perl
Andrey Konovalov
Товарищи! Нет ли возможности какой-то парсить JSON и YAML-конфиги в хеш, ключами которого являются конкатенированные последовательности наподобие JSON.Path?
Например,
{"data": {"creds": {"login": "jaja", "password": "nein"}}}
мог бы распарситься в хеш:
{
 'data.creds.login' => 'jaja',
 'data.creds.password' => 'nein'
}

Какие проблемы это решает?
1) Повышает быстродействие: доступ к $config{'data'}{'creds'}{'login'} в общем случае медленнее доступа к $config{'data.creds.login'}
2) Обеспечивает простой доступ к элементу по описанию пути к нему: используем реальный JSON.Path И не вынуждены рекурсивно обходить хеш в хеше в массиве в хеше для поиска какого-нибудь data.users.0.creds.password
3) Позволяет легко делать и загружать дампы подобных структур в виде набора пар ключ-значение

Какие проблемы создаёт:
1) Накладывает ограничения на имена полей: не позволяет использовать разделитель внутри имён полей. Например, нельзя назвать поле "foo.bar", если разделитель - точка.
2) Если много вложенных массивов и мало хешей - невыгодно с т.з. производительности
2) Длинные ключи в хеше
мне кажется, тебе на самом деле нужен Data::DPath
источник

AP

Anton Petrusevich in Modern::Perl
Andrey Konovalov
С учётом того, что для расчёта индекса в хеше используется неконтролируемый пользователем алгоритм и с вероятностью 99% этот алгоритм использует все символы ключа - эффективная реализация trie для "лексиконов" будет быстрее хеширования
сначала забенчмаркай этот кейс на своих данных. а то може оказаться, что твоя собака не на то дерево лает
источник

AK

Andrey Konovalov in Modern::Perl
Anton Petrusevich
сначала забенчмаркай этот кейс на своих данных. а то може оказаться, что твоя собака не на то дерево лает
Мне интереснее общее решение под множество кейсов определенного типа. В данном случае под всякие конфиги в xml, json, yaml , ini
источник