Есть ли массивы Эрланга "с определенным представлением"? - PullRequest
0 голосов
/ 21 декабря 2018

Контекст:

Программы Erlang, работающие на разнородных узлах, извлекающие и хранящие данные из баз данных Mnesia.Эти записи в базе данных предназначены для использования в течение длительного времени (например, в нескольких версиях версий Erlang) в форме объектов Erlang (т.е. без сериализации).Среди хранимой информации в настоящее время есть два использования массивов:

  1. Большие (до 16384 элементов) массивы.Быстрый доступ к элементу по его индексу послужил основой для выбора этого типа коллекции.После создания массива элементы никогда не изменяются.

  2. Маленькие (до 64 элементов) массивы.Доступ в основном осуществляется с помощью индексов, но есть и некоторые итерации (foldl / foldr).Как чтение, так и замена элементов выполняется часто.Размер коллекции остается постоянным.

Проблема:

В документации Эрланга по массивам говорится, что "Представлениене задокументировано и может быть изменено без уведомления. "Ясно, что массивы не должны использоваться в моем контексте: записи базы данных, содержащие массивы, могут интерпретироваться по-разному в зависимости от узла, выполняющего программу, и необъявленные изменения в том, как реализованы массивы, могут сделать их непригодными для использования.

Я заметил, что Эрлангфункции "ordsets" / "orddict" для решения аналогичной проблемы с "sets" / "dict", и, следовательно, ищу эквивалент "массив".Вы знаете что-нибудь?Если ничего не существует, моя стратегия, вероятно, будет использовать списки списков, чтобы заменить мои большие массивы, и постановление (с индексом в качестве ключа), чтобы заменить меньшие.Есть ли лучшее решение?

1 Ответ

0 голосов
/ 21 декабря 2018

Массив - это кортеж вложенных кортежей и целых чисел, причем каждый кортеж имеет фиксированный размер 10 и представляет сегмент ячеек.Если сегмент в настоящее время не используется, целое число (10) действует как заполнитель.Это без абстракции, я полагаю, что это закрытый эквивалент. Вы действительно можете скопировать модуль массива из otp и добавить его в свое собственное приложение, и, таким образом, это будет стабильное представление.

Что касается того, что вы должны использовать без массивазависит от данных и что вы будете делать с ними.Если данные, которые будут в вашем массиве, являются фиксированными, то после этого создается кортеж, который имеет постоянное время доступа для чтения / поиска.В противном случае список звучит как победитель, будь то список списков, список кортежей и т. Д. Однако, опять же, это выстрел в темноте, потому что я не знаю ваших данных или как вы их используете.

См. Реализацию здесь: https://github.com/erlang/otp/blob/master/lib/stdlib/src/array.erl

Также см. Ответ Роберта Вирдинга о реализации массива здесь: Реализация массивов в erlang

И что говорит Фред Хеберто массиве в Краткое посещение общих структур данных

Пример, показывающий структуру массива:

1> A1 = array:new(30).
{array,30,0,undefined,100}
2> A2 = array:set(0, true, A1).
{array,30,0,undefined,
       {{true,undefined,undefined,undefined,undefined,undefined,
              undefined,undefined,undefined,undefined},
        10,10,10,10,10,10,10,10,10,10}}
3> A3 = array:set(19, true, A2).
{array,30,0,undefined,
       {{true,undefined,undefined,undefined,undefined,undefined,
              undefined,undefined,undefined,undefined},
        {undefined,undefined,undefined,undefined,undefined,
                   undefined,undefined,undefined,undefined,true},
        10,10,10,10,10,10,10,10,10}}
4> 
...