如何操纵*巨大*数据量

时间:2010-04-13 13:44:48

标签: arrays memory memory-management hpc

我遇到以下问题。我需要存储巨大的数量的信息(~32 GB),并能够尽快操作它。我想知道最好的方法是什么(编程语言+操作系统的组合+你认为重要的东西)。

我正在使用的信息的结构是双精度浮点数(8字节)的4D数组(NxNxNxN)。现在我的解决方案是将4D阵列切成2D阵列并将它们存储在我计算机硬盘中的单独文件中。这真的很慢,数据操作难以忍受,所以这根本不是解决方案!

我正在考虑进入我国的超级计算设施并将所有信息存储在RAM中,但我不确定如何实现应用程序以利用它(我不是专业程序员,所以任何书籍/参考书都会对我有所帮助。)

我正在考虑的替代解决方案是购买具有大量RAM的专用服务器,但我不确定这是否能解决问题。所以现在我的无知并没有让我选择最好的方式继续下去。

如果你遇到这种情况,你会怎么做?我对任何想法持开放态度。

提前致谢!


编辑:很抱歉没有提供足够的信息,我会尝试更具体。

我正在存储一个离散化的4D数学函数。我想要执行的操作包括转换数组(改变b [i,j,k,l] = a [j,i,k,l]等),数组乘法等。

由于这是对拟议实验的模拟,因此操作仅应用一次。一旦获得结果,就不必对数据执行更多操作。


编辑(2):

我还希望将来能够存储更多信息,因此解决方案应该具有某种可扩展性。当前的32 GB目标是因为我希望数组的N = 256个点,但如果我可以使用N = 512(这意味着512 GB来存储它)会更好。

14 个答案:

答案 0 :(得分:3)

亚马逊的“高内存超大型实例”仅为$1.20/hr34 GB of memory。假设您没有经常运行此程序,您可能会发现它很有用..

答案 1 :(得分:2)

任何体面的答案都取决于您需要如何访问数据。随机访问?顺序访问?

32GB并不是那么大。

您需要多久处理一次数据?每(生命|年|日|纳秒)一次?通常,只需要完成一次。这会对您需要多少优化解决方案产生深远的影响。

你将进行什么样的操作(你提到乘法)?可以将数据拆分成块,这样一组操作的所有必要数据都包含在块中吗?这样可以更容易地将其拆分为并行执行。

这些天你购买的大多数计算机都有足够的内存来容纳32GB的内存。你不需要一台超级计算机。

答案 2 :(得分:2)

正如克里斯指出的那样,你打算如何处理这些数据。

此外,我认为将它存储在(关系型)数据库中比从硬盘驱动器中读取它要快,因为RDBMS会像缓存那样为你执行一些优化。

答案 3 :(得分:2)

如果您可以将问题表示为MapReduce,请考虑针对磁盘访问优化的群集系统,例如Hadoop。

您的描述听起来更加数学化,在这种情况下,您可能希望一次将所有数据都存储在内存中。一台机器中32 GB的RAM并非不合理; Amazon EC2提供最高68 GB的虚拟服务器。

答案 4 :(得分:2)

根据您的使用情况,一些数学和物理问题往往大多为零(例如,有限元模型)。如果您希望数据为真,则可以通过使用稀疏矩阵而不是将所有这些零实际存储在内存或磁盘上来节省大量空间。

查看维基百科以获取说明,并确定这是否符合您的需求: http://en.wikipedia.org/wiki/Sparse_matrix

答案 5 :(得分:1)

如果没有更多信息,如果您需要尽快访问所有数据,我会使用C作为您的编程语言,使用一些* nix作为O / S,并购买RAM,它现在相对便宜。这也取决于你所熟悉的,你也可以去windows路线。但正如其他人所说,这取决于你如何使用这些数据。

答案 6 :(得分:1)

到目前为止,有很多非常不同的答案。上面提到了两个很好的起点。大卫建议一些硬件,有人提到学习C.这些都是好点。

C将在速度和直接内存分页方面为您提供所需的功能。您要做的最后一件事是对数据执行线性搜索。那会慢 - 慢 - 慢。

确定您的工作流程 - 如果您的工作流程是线性的,则这是一回事。如果工作流程不是线性的,我会设计一个引用内存页面的二叉树。互联网上有大量关于B树的信息。此外,这些B树将更容易在C中使用,因为您还可以设置和操作内存分页。

答案 7 :(得分:1)

这是另一个想法:

尝试使用SSD存储数据。由于您正在抓取非常少量的随机数据,因此SSD可能会更快,更快。

答案 8 :(得分:1)

您可能想尝试使用mmap而不是将数据读入内存,但我不确定它是否适用于32Gb文件。

答案 9 :(得分:0)

整个数据库技术是关于操纵大量无法容纳在RAM中的数据,所以这可能是你的起点(即获得一本好的dbms原则书并阅读关于索引,查询执行等)。登记/> 很大程度上取决于您需要如何访问数据 - 如果您绝对需要跳转并访问随机信息,您就会遇到麻烦,但也许您可以构建数据处理结构,以便您可以一次扫描数据轴(尺寸)。然后,您可以使用较小的缓冲区并连续转储已处理的数据并读取新数据。

答案 10 :(得分:0)

我建议的第一件事就是选择面向对象的语言,开发或找到一个允许你操作4-D数组的类,而不用考虑它实际实现的方式。

这个类的实际实现可能会使用内存映射文件,因为它可以从低功耗开发机器扩展到您想要运行生产代码的实际机器(我假设您需要多次运行,因此性能很重要 - 如果你可以让它一夜之间运行,那么消费者PC可能就足够了。

最后,一旦我调试了算法和数据,我会考虑在可以将所有数据保存在内存中的机器上购买时间。例如,Amazon EC2将为您提供一台68 GB内存的机器,每小时2.40美元(如果您使用专色实例,则会减少)。

答案 11 :(得分:0)

对于换位,实际上只是改变对索引是什么的理解更快。通过这种方式,我的意思是您将数据保留在原来的位置,而是将访问者委托包装为将b[i][j][k][l]更改为获取(或更新)a[j][i][k][l]的请求。

答案 12 :(得分:0)

是否可以通过此程序解决?

首先创建M子进程并在paralel中执行它们。每个进程都将在一个集群的专用核心中运行,并将该数组的一些信息加载到该核心的RAM中。

父进程将是数组的管理者,调用(或连接)适当的子进程以获取某些数据块。

这会比HDD存储方法更快吗?或者我用大锤开裂坚果?

答案 13 :(得分:0)

如何处理大量数据通常围绕以下因素:

  • 数据访问顺序/参考位置:数据是否可以分离成独立的块,然后单独处理或以串行/顺序方式处理 vs。随机访问数据很少或没有订单?

  • CPU与I / O限制:处理时间是否更多地花费在计算数据上或从存储中读取/写入存储?

  • 处理频率:数据仅处理一次,每隔几周,每天等吗?

如果数据访问顺序基本上是随机的,您将需要访问尽可能多的RAM和/或找到一种方法来至少部分地组织订单,这样就不需要有太多的数据了记忆在同一时间。一旦超过物理RAM限制并发生重大交换,虚拟内存系统就会非常快地减慢 。解决问题的这个方面可能是最关键的问题。

除了上面的数据访问顺序问题,我认为您的问题没有明显的I / O问题。读取/写入32 GB通常在当前计算机系统上以分钟为单位进行测量,即使数据大小达到1 TB也不会超过几个小时。

编程语言选择实际上至关重要,只要它是一个编译语言,具有良好的优化编译器和体面的本机库:C ++,C,C#或Java都是合理的选择。我使用过的计算能力最强,I / O密集型的软件实际上是用Java编写的,部署在具有几千个CPU内核的高性能超级计算集群上。