arrays - Erlang中的大型可变字节数组

标签 arrays memory erlang byte minecraft

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

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

最佳答案

由于二进制文件是只读的,我可以考虑以下方法(假设您预计更改率很高):

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

关于arrays - Erlang中的大型可变字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071783/

相关文章:

c - 如何为我的 char 指针分配内存?

c# - 查找我可以为 C# 中的数组分配多少内存

javascript - 数组元素的赋值是否会复制或引用 JavaScript 中的元素?

c - 在 C 中返回多维字符数组

javascript - 按其值之一合并数组

erlang - 在 Erlang 中发送消息

erlang - 使用 RabbitMQ 延迟消息交换插件时出现“函数未导出”错误

c# - List<t> 到数组(在单独的类中)

c - 扩展c中字符串数组的大小

二郎。停止进程的正确方法