Здравствуйте, 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.