我有以下问题。我需要存储 巨大 信息量(~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来存储它)会更好。
亚马逊的“高内存超大型实例”仅限于此 $ 1.20 /小时 并且有 34 GB的内存。假设您没有经常运行此程序,您可能会发现它很有用。
任何体面的答案都取决于您如何访问数据。随机访问?顺序访问?
32GB并不是那么大。
您需要多久处理一次数据?每(生命|年|日|纳秒)一次?通常,只需要做一次东西。这会对您需要多少优化解决方案产生深远影响。
你将进行什么样的操作(你提到乘法)?可以将数据拆分成块,这样一组操作的所有必要数据都包含在一个块中吗?这将使拆分更容易并行执行。
这些天你购买的大多数计算机都有足够的RAM来容纳32GB的内存。你不需要一台超级计算机。
克里斯指出,你打算怎么处理数据。
此外,我认为将它存储在(关系型)数据库中比从硬盘驱动器读取它更快,因为RDBMS将像缓存一样为您执行一些优化。
如果您可以将问题表示为MapReduce,请考虑针对磁盘访问优化的群集系统,例如Hadoop。
您的描述听起来更像数学,在这种情况下,您可能希望一次将所有数据都存储在内存中。一台机器中32 GB的RAM并非不合理; 亚马逊EC2 提供高达68 GB的虚拟服务器。
根据您的使用情况,一些数学和物理问题往往大多为零(例如,有限元模型)。如果您希望数据为真,则可以通过使用稀疏矩阵而不是将所有这些零存储在内存或磁盘上来节省大量空间。
查看维基百科以获取描述,并确定这是否符合您的需求:
http://en.wikipedia.org/wiki/Sparse_matrix
没有更多的信息,如果你需要尽可能快地访问所有数据,我会使用C作为你的编程语言,使用一些* nix作为O / S,并购买RAM,它现在相对便宜。这也取决于你熟悉的东西,你也可以去windows路线。但正如其他人所说,它将取决于您如何使用这些数据。
到目前为止,有很多非常不同的答案。上面提到了两个很好的起点。大卫建议一些硬件,有人提到学习C.这些都是好点。
C将在速度和直接内存分页方面为您提供所需的功能。您要做的最后一件事是对数据执行线性搜索。那会慢 - 慢 - 慢。
确定您的工作流程 - 如果您的工作流程是线性的,这是一回事。如果工作流程不是线性的,我会设计一个引用内存页面的二叉树。互联网上有大量关于B树的信息。此外,这些B树在C中更容易使用,因为您还可以设置和操作内存分页。
这是另一个想法:
尝试使用SSD存储数据。由于您正在抓取非常少量的随机数据,因此SSD可能会快得多。