2012-02-09 50 views
2

我的团队正在研究Ruby中的MMO服务器,并且我们选择开始将计算密集型操作转换为C扩展。作为这一努力的一部分,我们将实际的数据存储移到了C中(使用Data_Get_Struct和所有这些)。因此,例如,每个Ruby“Zone”对象都有一个关联的“ZoneKernel :: Zone”C结构,其中存储了实际的二进制数据。将数据存储在红宝石C扩展中 - 可怕的想法与否?

基本上,我想知道这是否是一个可怕的想法。我对ruby内部并不是非常熟悉,但只要父区保留在ruby侧的内存中(因此可以防止垃圾回收C数据),数据似乎应该没问题。

有一点需要注意的是,我们已经得到了半定期的“堆栈一致性错误”,导致我们的服务器崩溃 - 这似乎是潜在的相关内存问题(而不仅仅是您的花园种类段错误) - 如果任何人有任何知识这可能是什么,我也很感激!

+0

这可能应该是在程序员.stackoverflow.com。 – 2012-02-09 19:33:44

回答

1

the documentation to Data_Wrap_Struct(klass, mark, free, ptr) function指出:

free参数是释放指针分配的功能。如果 这是-1,指针将被释放。

这些mark/free函数在执行GC期间调用。

当其相应的Ruby对象完成后,您的包装本机结构将自动释放。在此之前,除非您手动进行,否则您的数据将不会被释放。

写入C扩展不会保证性能提升,但它几乎总是会增加代码的复杂度。配置您的服务器以衡量您的性能收益,并在纯Ruby中开发您的Zone类,如果可行的话。

0

一般来说,我喜欢保留任何可能会改变的数据。从YAML或数据库加载它意味着你可以调整数据到你的心脏的内容,而无需重新编译。很显然,如果你的编译时间和加载时间很快,那么它不是一个大问题,但把它们分开是个好主意。

我喜欢YAML,因为它是一种标准格式,因此您可以从任意数量的语言访问相同的文件。您可以直接将它加载到C端或Ruby端,这取决于看起来更快/更聪明。