[Erlang] Крупные структуры данных
От: Mamut Швеция http://dmitriid.com
Дата: 18.09.07 15:41
Оценка:
На форуме проекта "Erlang по-русски" был задан следующий вопрос:

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

Мне надо обрабатывать очень большой массив однотипных структур — всего их порядка 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, остальные просто ждут). Вопрос: как мне организовать такой массив?


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


dmitriid.comGitHubLinkedIn
Re: [Erlang] Крупные структуры данных
От: BulatZiganshin  
Дата: 18.09.07 20:54
Оценка:
2 мкс? disk seek time ~10 ms

кроме того, я сомневаюсь, что накладные расходы любого БД-подобного движка уложатся в эти 2 мкс. так что первый вопрос, который я бы задал — а как ты решил бы эту задачу на C?
Люди, я люблю вас! Будьте бдительны!!!
Re: [Erlang] Крупные структуры данных
От: Cyberax Марс  
Дата: 18.09.07 21:01
Оценка:
Здравствуйте, Mamut, Вы писали:

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

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

Проще взять и написать модуль на С++, с использованием Boost.MultiIndex. Естественно, все должно хранится в памяти.
Sapienti sat!
Re[2]: [Erlang] Крупные структуры данных
От: Cyberax Марс  
Дата: 18.09.07 21:43
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>2 мкс? disk seek time ~10 ms

BZ>кроме того, я сомневаюсь, что накладные расходы любого БД-подобного движка уложатся в эти 2 мкс. так что первый вопрос, который я бы задал — а как ты решил бы эту задачу на C?
Уложатся, особенно если слегда расслабить требования на букву D в ACID.
Sapienti sat!
Re: преимущества erlang-а?
От: gandalfgrey  
Дата: 19.09.07 06:49
Оценка:
Здравствуйте, Mamut, Вы писали:

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

При использовании Мнезии времена около 2 мкс для поиска вполне достижимы. На Пне-4 2.1 Ггц у меня было менее 6 мкс под Вынью. Запись там с 2-мя уровнями кэширования ( в памяти и на диске ), отчего многое зависит от быстродействия диска и размера его аппаратного кэша.
Ну и конечно же — память и еще раз память ! Чем ее больше, тем быстрее работает
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.
Re[2]: [Erlang] Крупные структуры данных
От: Gaperton http://gaperton.livejournal.com
Дата: 19.09.07 09:53
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>На 32-х битной ахитектуре это все в память не влезет принципиально. А в каком состоянии порт Эрланга на 64 бита и какие у него свойства я не знаю.

G>Так что единственный вариант — это dets (и то — надо протестировать, как это будет . Ets не канает — она живет только в памяти. mnesia ничего полезного не добавит, только лишние ресурсы отожрет.

Хотя можно использовать mnesia в режиме fragmented tables — тогда есть надежда, что еще и кэширование будет адекватно работать средствами mnesia. Ведь там часто в одни и те же поля запросы идут?

Второй вариант — организовать собственный кэш в памяти. Write through кэш делается просто элементарно, write back — тут надо думать, как делать. Но тоже можно.

Я бы все перечисленное пробовал только по показаниям — если dets будет работать неадекватно.
Re[2]: [Erlang] Крупные структуры данных
От: Cyberax Марс  
Дата: 19.09.07 11:26
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>На 32-х битной ахитектуре это все в память не влезет принципиально. А в каком состоянии порт Эрланга на 64 бита и какие у него свойства я не знаю.

G>Так что единственный вариант — это dets (и то — надо протестировать, как это будет . Ets не канает — она живет только в памяти. mnesia ничего полезного не добавит, только лишние ресурсы отожрет.
Влезет, впритык. Если хорошо постараться и пошаманить. Ну и еще PAE есть — его из С-шного модуля можно использовать в Windows.
Sapienti sat!
Re[3]: [Erlang] Крупные структуры данных
От: Gaperton http://gaperton.livejournal.com
Дата: 19.09.07 12:56
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Gaperton, Вы писали:


G>>На 32-х битной ахитектуре это все в память не влезет принципиально. А в каком состоянии порт Эрланга на 64 бита и какие у него свойства я не знаю.

G>>Так что единственный вариант — это dets (и то — надо протестировать, как это будет . Ets не канает — она живет только в памяти. mnesia ничего полезного не добавит, только лишние ресурсы отожрет.
C>Влезет, впритык. Если хорошо постараться и пошаманить. Ну и еще PAE есть — его из С-шного модуля можно использовать в Windows.

На настольной винде у тебя процессу отводится 2 гига адресного пространства (не влезет гарантированно). На серверной винде — 3 гига на процесс (все равно не влезет), а PAE (это страничная адресация, позволяющая адресовать до 64 гиг, да?), если мне не изменяет память, есть только в самой крутой серверной винде.

Так что на десктопной 32-х битной винде — не влезет точно. А чем извращаться с PAE (это того не стоит) , проще взять 64-битную ось и закрутить ее, скажем, на оптероне, и добить памяти до восьми гиг. Вот тогда можно реально рассчитывать, что влезет.
Re[3]: [Erlang] Крупные структуры данных
От: BulatZiganshin  
Дата: 19.09.07 12:56
Оценка:
G>>На 32-х битной ахитектуре это все в память не влезет принципиально. А в каком состоянии порт Эрланга на 64 бита и какие у него свойства я не знаю.
C>Влезет, впритык. Если хорошо постараться и пошаманить. Ну и еще PAE есть — его из С-шного модуля можно использовать в Windows.

3гб нужно только для данных. а ещё есть индексы
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: [Erlang] Крупные структуры данных
От: Cyberax Марс  
Дата: 19.09.07 14:13
Оценка:
Gaperton wrote:
> На настольной винде у тебя процессу отводится 2 гига адресного
> пространства (не влезет гарантированно).
На XP Pro можно ключик /3G указать — работает.

> На серверной винде — 3 гига на процесс (все равно не влезет),

> а PAE (это страничная адресация, позволяющая адресовать до
> 64 гиг, да?), если мне не изменяет память, есть только в
> самой крутой серверной винде.
Нет, она есть во всех виндах — там только максимальный разрешенный объем
физической памяти ограничивают на обычных виндах до 4Гб. Я даже писал на
XP приложение, его использующее. Когда писал — вспоминал старый добрый
DOS с его сегментной адресацией

> Так что на десктопной 32-х битной винде — не влезет точно. А чем

> извращаться с PAE (это того не стоит) , проще взять 64-битную ось и
> закрутить ее, скажем, на оптероне, и добить памяти до восьми гиг. Вот
> тогда можно реально рассчитывать, что влезет.
Ну да, это надежный метод. Просто не всегда возможен, в частности из-за
несовместимости кучи софта с 64-битной Виндой
Posted via RSDN NNTP Server 2.1 beta
Sapienti sat!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.