Erlang中的大型可变字节数组

clo*_*ejo 9 memory arrays erlang byte minecraft

当我在Erlang中编写一个简单的Minecraft服务器应用程序时,我现在关注如何有效地存储和修改块数据的问题.对于那些不了解Minecraft内部的人:我需要在内存中存储大量高达32kB的二进制文件(100-1000).在此之前,Erlang的内置二进制文件就足够了.但是服务器必须经常读取和更改这些二进制文件中的一些字节(通过它们的id),我不想一直复制它们.
一个很好的功能是从/向Erlang的标准二进制文件导入和导出.

是否有任何Erlang扩展或数据库或我可以使用的任何东西?

Iva*_*rov 9

由于二进制文件是只读的,我可以考虑以下方法(假设您期望高变化率):

  1. 使用树状结构,叶子中的不可变二进制文件相对较小.在这种情况下,当您修改数据时,您只需要重新创建小叶二进制+所有节点直到根.假设变化对某个位置是"本地的",我认为,你可以从octo-tree开始.
  2. 使用"大"二进制文件+更改列表(可以是简单的函数列表).当您需要修改世界时,只需将新功能添加到列表中即可.当有人要求世界状态时,请使用基本二进制并应用列表中的所有更改.不时"压缩"所有更改并准备新的基线状态二进制文件.这可以与先前的方法(叶子中具有二元/变化对的树)组合.
  3. 将可变世界管理移动到外部代码.您可以使用NIF端口.我想,那将是最快的方式.此外,我认为实施它会相对容易.API的第一个版本可以很简单world:new(X, Y, Z) -> ref(); world:get(Ref, X, Y, Z); world:set(Ref, X, Y, Z, Value);