Ruby:管理大型3d阵列的最佳方法

Ruby:管理大型3d阵列的最佳方法,ruby,large-data-volumes,Ruby,Large Data Volumes,我想知道使用以下内容管理大型3d阵列的最佳方法: x=1000 y=1000 z=100 =>100000000个对象 每个单元格都是一个具有一定数据量的对象 即使所有数据都被折叠,简单的方法也是非常冗长的(我首先尝试了对象数组的数组) 我在某个地方读到,对于这种情况,DB可能是一件好事 你觉得这个怎么样 我想做什么? 这个“矩阵”代表一个世界。每个元素都是一个1mx1mx2m的块体,可能是不同的类型(水、泥、石头等),有些块体也可能是空的 但是用户应该能够移除任何地方的障碍物,并改变周围的一切

我想知道使用以下内容管理大型3d阵列的最佳方法:

x=1000 y=1000 z=100

=>100000000个对象

每个单元格都是一个具有一定数据量的对象

即使所有数据都被折叠,简单的方法也是非常冗长的(我首先尝试了对象数组的数组)

我在某个地方读到,对于这种情况,DB可能是一件好事

你觉得这个怎么样

我想做什么?

这个“矩阵”代表一个世界。每个元素都是一个1mx1mx2m的块体,可能是不同的类型(水、泥、石头等),有些块体也可能是空的

但是用户应该能够移除任何地方的障碍物,并改变周围的一切(例如,如果他们发现水在后面,它将流过孔)

事实上,我希望做的不是Minecraft,而是一个矮人女的小克隆(http://www.bay12games.com/dwarves/)

其他有趣的事情

在我的模型中,地面处于10级。这意味着[0,10]在大多数情况下是空的天空。 这些地层上只能出现山丘和部分山脉

地下基本上是未知的,没有挖掘。所以我们不应该为未使用的区块添加实例

我们应该从一开始就添加到模型中:宝石、黄金、水,它们可以存储而不必存储相邻的石头/心情/土块

在游戏开始时,80%的立方体不需要加载到内存中

每次我们挖掘时,我们都会创建新的块:我们挖掘的空块和周围的块

我们应该索引的唯一内容是:

  • 地下河
  • 地下湖泊
  • 熔岩河

在内存中保留许多对象从来都不是一件好事。以平面文件或数据库为中心的方法将更高效,更易于维护

我要做的是——面向对象的方法 将块的参数存储为简单数据,并动态构造对象

创建一个
Block
类来表示游戏中的一个Block,并为其提供变量来保存该特定Block的参数:

class Block
  # location of the Block
  attr_accessor :x, :y, :z

  # an individual id for the Block
  attr_accessor :id

  # to define the block type (rock, water etc.)
  attr_accessor :block_type

  # and add any other attributes of a Block...
end
然后我会创建一些方法,使我能够将数据序列化/反序列化到文件或数据库

正如您所说,它在棋盘上工作,您还需要一个
棋盘
类来表示它,它将维护游戏状态,并对
对象执行操作。使用每个
中的
x,y,z
属性,您可以确定其在游戏中的位置。使用此信息,您可以然后可以在
Block
类中编写一个方法,定位与当前块相邻的那些块。这将使您能够执行您所说的“级联”效果,其中一个块受另一个块上的操作的影响

高效地访问数据 这将完全取决于您选择如何序列化块对象。我可能会选择二进制格式,以减少不必要的数据读取,并通过对象的
id
参数存储对象,然后使用类似的方法以类似数组的方式快速对大数据文件执行随机访问读/写。这将允许您快速有效地访问数据,无需内存开销。读取数据的方式将与上面的相邻块方法相关

当然,您也可以选择DB存储路由,这将允许您隔离块并以更高级别的方式查找特定块,但是这可能会给您带来一些额外的开销

这听起来像是一个有趣的项目,我希望这能有所帮助!:)


关于@Linuxious关于选择不同语言的评论,请注意。是的,这在某些情况下可能是正确的,但是一个熟练的程序员从不责怪他的工具。程序的效率取决于程序员的能力……除非您是用Java编写的;)

一切都取决于你想做什么!如果您需要一些持久性,那么是的,DB可能是一件好事,如果您只想用它做简单的工作,也许您应该将它们封装在一个类中。这个问题有点太模糊了。你能把你的问题说清楚一点吗?如果你真的需要大量数据的高性能,你需要一种不同的语言。我添加了更多关于我想做什么的信息。你能举个例子说明你的方法在做什么吗?如果这些方法在整个矩阵上运行并触及每个单元,那么这确实是一个大问题。但是,如果单元格中有许多相似的对象,并且不需要每个对象都有自己的特定字符,那么可以使用一些设计模式来加快处理速度。在任何情况下,对于如此大的数据量,简单的方法都是行不通的。例如,每滴水都会对相邻的立方体造成侵蚀,因此受影响的立方体的硬度会降低。这将在水区的所有边界上进行计算(不经常,但会)。最常见的事件是当一个角色挖掘并移除一个立方体时:我必须控制周围的所有立方体。这更像是一种“级联效应”,而且肯定不会在一次操作中对所有板产生影响。非常感谢您提供了这个伟大的答案:)我思考了我的问题,发现了一些问题:我是否需要为所有块都提供一个实例?不在地面和洞穴上,它应该代表最大体积的30%。。。默认情况下,我将地面定位在标高10处,因此[0,10]几乎是空的(只有一些山丘,可能还有部分山丘)。地下将被挖掘,但不是在所有层面上,也不是在所有表面上。这就是为什么我试图初始化一个充满
nil
的多维数据集,并且只有几个真正的
块,而且速度要快得多。现在我来看看你说的话。这是非常有趣的:)
class Block
  # location of the Block
  attr_accessor :x, :y, :z

  # an individual id for the Block
  attr_accessor :id

  # to define the block type (rock, water etc.)
  attr_accessor :block_type

  # and add any other attributes of a Block...
end