Хранение данных в расширении ruby ​​C - ужасная идея или нет? - PullRequest
2 голосов
/ 09 февраля 2012

Моя команда работает над MMO-сервером в Ruby, и мы решили начать переводить вычислительно-сложные операции в расширение C.В рамках этих усилий мы переместили фактическое хранилище данных в C (используя Data_Get_Struct и все такое).Так, например, у каждого объекта "Zone" в Ruby есть связанная структура "ZoneKernel :: Zone" C, в которой хранятся фактические двоичные данные.

По сути, мне интересно, является ли это ужасной идеей или нет,Я не очень знаком с внутренностями ruby, но кажется, что данные должны быть в порядке, пока родительская зона остается в памяти на стороне ruby ​​(таким образом предотвращая сбор мусора данных C).

Одно предупреждение: мы получаем полурегулярные «ошибки согласованности стека», которые приводят к сбою на нашем сервере - это похоже на потенциально связанную проблему с памятью (а не только на segfault вашего сорта сада) - если кто-то знает, что это может бытьЯ также был бы признателен за это!

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Как указано в документации Data_Wrap_Struct(klass, mark, free, ptr) функция :

Аргумент free - это функция для освобождения выделения указателя. Если это -1, указатель будет просто освобожден.

Эти mark / free функции вызываются во время выполнения GC.

Ваша обернутая нативная структура будет автоматически освобождена, когда ее соответствующий объект Ruby будет завершен. Пока это не произойдет, ваши данные не будут освобождены, если вы не сделаете это вручную.

Написание расширений C не гарантирует повышение производительности, но почти всегда увеличивает сложность вашего кода. Профилируйте свой сервер, чтобы измерить прирост производительности, и разработайте класс Zone в чистом Ruby, если это возможно.

0 голосов
/ 09 февраля 2012

В общем, мне нравится хранить любые данные, которые могут измениться вне моего источника. Загрузка его из YAML или базы данных означает, что вы можете настроить данные так, как вам хочется, без необходимости перекомпиляции. Очевидно, что если ваше время компиляции и время загрузки быстрая, то это не такая большая проблема, но все же хорошая идея разделить их.

Я предпочитаю YAML, потому что это стандартный формат, поэтому вы можете получить доступ к одному и тому же файлу на любом количестве языков. Вы можете загрузить его прямо в сторону C или в сторону Ruby, в зависимости от того, что кажется быстрее / умнее.

...