Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何操作*大量*数据_Arrays_Memory_Memory Management_Hpc - Fatal编程技术网

Arrays 如何操作*大量*数据

Arrays 如何操作*大量*数据,arrays,memory,memory-management,hpc,Arrays,Memory,Memory Management,Hpc,我有以下问题。我需要存储大量的信息(~32 GB),并能够尽可能快地对其进行操作。我想知道最好的方法是什么(编程语言+操作系统+任何你认为重要的东西的组合) 我使用的信息结构是一个4D数组(nxn),由双精度浮点(8字节)组成。现在我的解决方案是将4D阵列分割成2D阵列,并将它们存储在计算机硬盘中的单独文件中。这真的很慢,而且对数据的操作令人无法忍受,所以这根本不是解决方案 我正在考虑搬进我国的超级计算设施,将所有信息存储在RAM中,但我不确定如何实现一个应用程序来利用它(我不是专业程序员,所以

我有以下问题。我需要存储大量的信息(~32 GB),并能够尽可能快地对其进行操作。我想知道最好的方法是什么(编程语言+操作系统+任何你认为重要的东西的组合)

我使用的信息结构是一个4D数组(nxn),由双精度浮点(8字节)组成。现在我的解决方案是将4D阵列分割成2D阵列,并将它们存储在计算机硬盘中的单独文件中。这真的很慢,而且对数据的操作令人无法忍受,所以这根本不是解决方案

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

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

如果你处于这种情况,你会怎么做?我愿意接受任何想法

提前谢谢


编辑:很抱歉没有提供足够的信息,我会尽量说得更具体一些

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

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


编辑(2):


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

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

32GB并没有那么大

您需要多久处理一次数据?每(一生|年|天|小时|纳秒)一次?通常,事情只需要做一次。这对优化解决方案所需的工作量有着深远的影响

您将执行什么类型的操作(您提到乘法)?数据是否可以拆分为块,以便一组操作所需的所有数据都包含在一个块中?这将使它更易于拆分以并行执行


现在你买的大多数电脑都有足够的内存来存储32GB的内存。你不需要一台超级计算机就可以做到这一点。

正如克里斯所指出的,你将如何处理这些数据


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

如果您需要尽可能快地访问所有数据,我将使用C作为编程语言,使用某种风格的*nix作为O/S,并购买RAM,现在相对便宜。这也取决于你熟悉什么,你也可以选择windows路线。但正如其他人所提到的,这将取决于您如何使用这些数据。

整个数据库技术都是处理RAM中无法容纳的大量数据,因此这可能是您的出发点(即,获取一本好的dbms原理书,阅读有关索引、查询执行等的内容)。

这在很大程度上取决于您需要如何访问数据——如果您确实需要跳转并访问随机的信息位,那么您就有麻烦了,但也许您可以构建数据处理的结构,以便沿一个轴(维度)扫描数据。然后,您可以使用较小的缓冲区,连续转储已处理的数据并读取新数据。

亚马逊的“高内存超大实例”是唯一的。如果你不经常运行这个程序,你可能会发现它是有用的。

如果你可以将你的问题表示为MapReduce,考虑一个优化磁盘访问的集群系统,如Hadoop。
您的描述听起来更加数学化,在这种情况下,您可能希望同时将所有数据存储在内存中。单机内存32GB并非不合理;提供高达68 GB的虚拟服务器。

我建议的第一件事是选择一种面向对象的语言,并开发或找到一个类,让您可以操作一个4-d阵列,而不必关心它的实际实现方式

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


最后,一旦我调试了我的算法和数据,我会考虑在一台可以将所有数据存储在内存中的机器上争取时间。例如,将为您提供一台68 GB内存的机器,每小时2.40美元(如果您使用spot实例,则更少).

对于换位,实际上只改变你对什么索引是什么的理解会更快。我的意思是,你把数据放在原处,而是将一个更改
b[I][j][k][l]
的访问者委托包装到一个请求中,以获取(或更新)
a[j][I][k][l]

通过这个过程可以解决吗

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

父进程