Re: [Erlang] Крупные структуры данных
От: Gaperton http://gaperton.livejournal.com
Дата: 19.09.07 09:43
Оценка:
Здравствуйте, Mamut, Вы писали:

M>На форуме проекта "Erlang по-русски" был задан следующий вопрос:


M>http://erlang.dmitriid.com/forum/topic/11

M>

M>Мне надо обрабатывать очень большой массив однотипных структур — всего их порядка 60 миллионов. Каждая структура вида {PID, type (atom), direct (atom), index (Integer), nextind (Integer), prevind (Integer), position (Integer)}. Я думаю такая структура займёт около 50 байт, и того на весь массив надо 60 * 50 = 3 ГБ. А это значит массив желательно должен частично сбрасываться на диск. Плюс нужен быстрый доступ по полям PID, index, nextind, prevind: время поиска нужной структуры по этим полям должно составлять около 2 мкс, время их записи — столько же. Запись и чтение часто идёт в одни и те же структуры (обчно их всего около 30 000, остальные просто ждут). Вопрос: как мне организовать такой массив?


M>Максимум, что я могу посоветовать — это использовать (d)ets или mnesia, на более развернутый ответ силенок не хватает. Помогите, а?


На 32-х битной ахитектуре это все в память не влезет принципиально. А в каком состоянии порт Эрланга на 64 бита и какие у него свойства я не знаю.
Так что единственный вариант — это dets (и то — надо протестировать, как это будет . Ets не канает — она живет только в памяти. mnesia ничего полезного не добавит, только лишние ресурсы отожрет.

Учитывая требования к производительности, я бы постарался выжать максимум из dets — это самое простое и быстрое для дисковых look-up запросов, что можно себе в принципе представить. Это быстрее mnesia — у dets меньше оверхэд. Это теоретически должно быть быстрее реляционных БД — там применяются хэшлисты, а не B-деревья, и живет это в вашем процессе, а не в другом. Добиванием памяти к системе мы добьемся того, что оперсистема будет кэшировать фрагменты dets. Так что все должно быть ok.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.