11

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

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

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

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

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

提前致谢!


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

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

由于这是对提议的实验的模拟,因此这些操作将只应用一次。一旦获得结果,就无需对数据执行更多操作。


编辑(2):

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

4

14 回答 14

3

亚马逊的“High Memory Extra Large Instance”仅需1.20 美元/小时,拥有34 GB 内存。假设您没有经常运行此程序,您可能会发现它很有用。

于 2010-04-13T14:09:02.393 回答
2

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

您的描述听起来更加数学密集,在这种情况下,您可能希望一次将所有数据保存在内存中。单机32GB内存也不是不合理;Amazon EC2提供高达 68 GB 的虚拟服务器。

于 2010-04-13T14:09:50.530 回答
2

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

32GB并不是那么大。

您需要多久处理一次数据?每(生命周期 | 年 | 天 | 小时 | 纳秒)一次?通常,事情只需要完成一次。这对您需要优化解决方案的程度有着深远的影响。

您将执行什么样的操作(您提到乘法)?是否可以将数据拆分成块,使得一组操作所需的所有数据都包含在一个块中?这将使拆分它以更容易地并行执行。

您现在购买的大多数计算机都有足够的 RAM 来容纳 32GB 的内存。你不会仅仅为此而需要一台超级计算机。

于 2010-04-13T13:51:53.137 回答
2

正如 Chris 所指出的,您将如何处理这些数据。

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

于 2010-04-13T13:52:35.143 回答
1

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

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

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

于 2010-04-13T16:32:23.180 回答
1

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

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

于 2010-04-13T16:34:05.427 回答
1

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

于 2010-04-13T13:55:25.973 回答
1

这是另一个想法:

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

于 2010-04-13T17:26:35.287 回答
1

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

于 2010-06-06T18:45:01.717 回答
0

对于转置,实际上只是改变您对什么是索引的理解会更快。这样,我的意思是您将数据保留在原处,而是将更b[i][j][k][l]改为请求的访问器委托包装为 fetch (或 update) a[j][i][k][l]

于 2010-04-13T14:54:25.440 回答
0

整个数据库技术是关于处理大量无法放入 RAM 的数据,因此这可能是您的起点(即,获得一本好的 dbms 原理书并阅读有关索引、查询执行等方面的内容)。
很大程度上取决于您需要如何访问数据 - 如果您绝对需要跳转并访问随机的信息位,那么您就有麻烦了,但也许您可以构建数据处理,以便您沿着一个扫描它轴(尺寸)。然后您可以使用较小的缓冲区并不断转储已处理的数据并读取新数据。

于 2010-04-13T14:01:56.203 回答
0

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

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

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

于 2010-04-13T14:12:56.240 回答
0

可以通过这个程序解决它吗?

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

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

这会比 HDD 存储方法更快吗?还是我用大锤敲碎坚果?

于 2010-04-13T15:56:08.587 回答
0

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

  • 数据访问顺序/参考位置:数据是否可以分成独立的块,然后独立或以串行/顺序方式处理,而不是随机访问数据,几乎没有或没有顺序?

  • CPU vs I/O bound:处理时间是花在计算数据上还是从/向存储读取/写入数据上?

  • 处理频率:数据是否只处理一次、每隔几周、每天等?

如果数据访问顺序本质上是随机的,您将需要访问尽可能多的 RAM 和/或找到一种方法来至少部分组织顺序,这样就不需要在内存中存储尽可能多的数据。同时。一旦超出物理 RAM 限制并发生大量交换,虚拟内存系统就会很快变慢。解决问题的这方面可能是最关键的问题。

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

编程语言的选择实际上并不重要,只要它是一种具有良好优化编译器和不错的本地库的编译语言:C++、C、C# 或 Java 都是合理的选择。我从事过的计算和 I/O 最密集的软件实际上是用 Java 编写的,并部署在具有几千个 CPU 内核的高性能超级计算集群上。

于 2010-06-06T18:16:53.677 回答