2012-03-06 75 views
4

我需要处理3D立方体数据。其元素数量可能达数十亿。我知道我无法在Windows上分配太多内存。所以我正在考虑使用进程内数据库进行基于磁盘的操作。有没有更好的方法来做到这一点?也许有什么提升?如何在C++中处理大小为1,000,000,000的数组?

更新:我最终必须提供绘图浏览功能。

更新2:下面的文章似乎是使用内存映射文件的一个很好的解决方案。我会尝试它并再次更新。 http://www.codeproject.com/Articles/26275/Using-memory-mapped-files-to-conserve-physical-mem

+1

好吧,Win7的临高达192GB,这是以上几种支持大型阵列相当有用,我认为:) – 2012-03-06 17:11:50

+6

请解释你正在试图处理你的数据。有了这么多的元素,你真的想仔细考虑你正在努力完成什么。您将运行的算法将确定适当的数据结构。例如,我想你可能实际上是在谈论一个1000x1000x1000立方体,也许大部分元素都是空的。也许你想要一棵八叉树。但也许需要完全不同的东西。我们需要更多信息。 – 2012-03-06 17:12:32

+0

@AlanBaljeu我希望你的猜测是对的。但立方体是另一个密集维度的图像。所以我需要这么大的尺寸,所有的元素都同样重要。 – 2012-03-06 17:16:08

回答

4

您能否更有效地存储数据(请阅读Bentley的“Programming Pearls”),是否稀疏数据?

如果不是,内存映射文件(MMF)是你的朋友,并允许你映射MMF块到内存中,你可以像其他任何内存一样访问内存。

使用CreateFileMappingMapViewOfFile将块映射到您的过程中。

+0

感谢您的回答。不,它根本不稀疏。它是另一个密集维度的图像。你能给我一些关于如何处理MMF的参考吗?我真的希望有一个简单的库,所以我可以像数组一样使用它。 – 2012-03-06 17:12:38

+0

@david:编辑我的答案。 – 0xC0000022L 2012-03-06 17:18:29

+0

我没有直接使用你的答案,但我找到了一个使用内存映射文件的解决方案。谢谢你给我指导。 – 2012-03-06 19:30:29

5

第一步也是最基本的一步就是将数据分解成块。块的大小取决于您的需求:它可以是一次可以绘制的最小或最大的块,也可以是可以构建几何的几何块,也可以是压缩的最佳大小。

一旦处理了可管理的块,立即回忆内存问题就会消失。根据需要流式传输块(加载和卸载/保存)。

在加载/保存过程中,您可能希望涉及压缩和/或各种数据库。即使像RLE和SQLite这样简单的东西(包含坐标和数据blob的单表)也可以节省很多空间。更好的压缩将允许您使用更大的块大小。

根据使用情况,可能会将块压缩在内存中,并且只能在修改时进行简单解压缩(或者可以对其进行修改时)。如果您的数据是只读的,加载它们并仅在需要时解压缩将非常有用。

将数据拆分成块也具有副作用,例如对于八叉树而言是一种非常简单的形式,允许在独立的数据块上运行几何体生成(行进多维数据集等)(并简化线程),并进行保存/加载过程显着简单。

+0

同样,我的数据是另一个密集维度的图像。我不知道如何将数据分成块。是的,我也在想SQLite。不过,我真的希望有更好的API。感谢您的回答。 – 2012-03-06 17:23:50

+0

如果你的数据是图像,那么自然的假设是将图像分割。这将在切片环境中起作用。如果数据依赖于其3D邻居,则稍微复杂一些。如果您可以在问题中更详细地描述数据,或者更好地给出一个小样本,那将会很有帮助。 – ssube 2012-03-06 17:27:15

+0

是的,数据依赖于它的3D邻居。这是高光谱图像。所以我不能通过图像真正分割 – 2012-03-06 17:34:08