问题 如何操纵*巨大*数据量


我有以下问题。我需要存储 巨大 信息量(~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来存储它)会更好。


11756
2018-04-13 13:44


起源

这在很大程度上取决于您计划对这些数据实际做些什么。你能更清楚地了解自己的运营吗? - Chris Tonkinson
32GB并不是那么多。在大型强子对撞机的ATLAS实验中,仅仅超过5分钟的输出(峰值速率)...... - Donal Fellows
为了补充Chris所说的,处理大量数据有不同的方法,其中一些方法比其他方法更有利于某些用途。例如,过多的分页会破坏您的性能,为了避免这种情况,有必要知道您将如何访问数据。 - David Thornley
你有64位系统,内存> 32GB吗?你能买一个吗?您的转换计算密集吗?您的应用程序可以分发到一组机器吗? “快”有多快? - Stephen
@Donal:我确信ATLAS的那些人根据这些数字有预算:-) @ David + @ Stephen:表现很重要但不是那么多。我可以先尝试N = 64,一旦调试正确,我可以运行它N = 256,等待,比如两天?现在主要问题是我无法将其存储在快速(比HDD更快)的存储设备中。我可以访问我大学的一个集群,而另一个集群在我所居住的城市(0,12€/ h)。关于它是否可以分发到集群,不知道,这可能是一个解决方案。我怎么知道呢? - Alejandro Cámara


答案:


亚马逊的“高内存超大型实例”仅限于此 $ 1.20 /小时 并且有 34 GB的内存。假设您没有经常运行此程序,您可能会发现它很有用。


3
2018-04-13 14:09



32 GB是我将使用的最小量,我希望找到一个可扩展的解决方案,以便将来能够使用更多内存(256 GB?)。 - Alejandro Cámara
如果你看看我链接的第二页,亚马逊的内存高达68 GB,同时价格合理(再次,只要你不经常使用它)。 - Brendan Long
租用功能非常强大的硬件而不是花时间去尝试优化问题有一些东西可以说。十小时1.20美元/小时是12美元,远远低于该领域的任何有关方面的最低咨询费。 - David Thornley
特别是在罕见时(即每月一次左右)。 - TomTom


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

32GB并不是那么大。

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

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

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


2
2018-04-13 13:51



我非常怀疑有任何家用电脑可以容纳32GB内存。但我明白你的意思是,打开一个32GB的文件,如果它是64位操作系统,不会使计算机超载。很多32GB将在交换空间中持有 - thecoshman
@thecoshman:是的。我傻了。但快进5年和32GB将是 瘸 :)我有点困惑,经过锻炼他需要大约256GB - 并且想, 等一下,256?我的笔记本电脑里有3TB。但事实上,这就像3个数量级...... - Daren Thomas
有。如今,普通的家用电脑可以容纳16GB的内存。添加虚拟内存(快速光盘,SSD)和处理32gb“仅在内存中”实际上是可行的,如果不经常发生的话。服务器主板现在容易容纳128GB,但价格要贵得多。 - TomTom


克里斯指出,你打算怎么处理数据。

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


2
2018-04-13 13:52



我不知道任何不缓存HD的现代操作系统。 - Steven Sudit
它是一个4维浮点数组,当你有4个已知索引时,使用RDBMS似乎不是最理想的。 - Stephen


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

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


2
2018-04-13 14:09





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

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


2
2018-04-13 16:34



无法重复。 - Johan Benum Evensberget
这是一个很好的建议,但在这种情况下不适用。实际上,我尝试拟合数据,因此空值的数量最小! - Alejandro Cámara


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


1
2018-04-13 13:55





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

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

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


1
2018-04-13 16:32



我不太确定你所说的一切(我不是程序员类型),但我理解的位听起来很合理。硬件一意味着要花一些钱:1)SSD驱动器,2)计算时间。这是一个很好的补丁,但不是我正在寻找的可扩展解决方案。另一种方法是学习C能够随机访问文件以提高速度,尊重当前的线性访问方式。这听起来更像是,但这意味着我要花时间学习(这不一定是坏事:) - Alejandro Cámara


这是另一个想法:

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


1
2018-04-13 17:26



这是我想到的,但我不确定它会不会减少执行时间。我在常规硬盘驱动器上进行了N = 256的测试,花了一个月的时间。我认为它不会花费少于,什么?,两周?但是与另一个混合使用它仍然是一个很好的半解决方案(迁移到Python,甚至更好,C)。 - Alejandro Cámara
我读到的是,对于随机访问,SSD要快得多。此图表显示来自英特尔的SSD(我认为 - 很难说硬盘的性能有多差)比硬盘驱动器快100倍: anandtech.com/show/2738/25 即使是最保守的也至少要快20倍。 - Brendan Long
RealSSD的光盘执行40k IOPS。这是随机访问的HUGH。像100到1000的因素。他们变得更快。 - TomTom