代码之家  ›  专栏  ›  技术社区  ›  Alejandro Cámara

如何操作*大量*数据

  •  11
  • Alejandro Cámara  · 技术社区  · 14 年前

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

    我使用的信息的结构是一个4D数组(nxn),由双精度浮点(8字节)组成。现在我的 解决方案 就是将4D阵列分割成2D阵列,并将它们存储在我电脑的HDD中的不同文件中。这是真的很慢,数据的操作是无法忍受的,所以这是没有解决方案在所有!

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

    如果你遇到这种情况,你会怎么做?我愿意接受任何意见。


    编辑:

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

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


    编辑(2):

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

    14 回复  |  直到 14 年前
        1
  •  3
  •   Brendan Long    14 年前
        2
  •  2
  •   Daren Thomas    14 年前

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

    32GB并没有那么大。

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

    你要做什么样的运算(你提到乘法)?数据是否可以分割成块,以便一组操作所需的所有数据都包含在一个块中?这将使拆分它以便于并行执行。

        3
  •  2
  •   Henri    14 年前

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

        4
  •  2
  •   Stuart Sierra    14 年前

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

        5
  •  1
  •   BlackICE    14 年前

    如果你不需要更多的信息,如果你需要最快速的访问所有的数据,我会用C作为你的编程语言,用一些*nix的风格作为O/S,买RAM,现在相对便宜。这也取决于你熟悉什么,你也可以走windows路线。但正如其他人提到的,这将取决于你如何使用这些数据。

        6
  •  1
  •   IAbstract    14 年前

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

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

        7
  •  1
  •   Hank    14 年前

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

    请查看wikipedia以获取说明,并确定这是否可以满足您的需要: http://en.wikipedia.org/wiki/Sparse_matrix

        8
  •  1
  •   Brendan Long    14 年前

    还有一个想法:

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

        9
  •  1
  •   lhf    14 年前

    你可以尝试使用 mmap

        10
  •  0
  •   Marcin K    14 年前

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

        11
  •  0
  •   Donal Fellows    14 年前

    b[i][j][k][l] 请求获取(或更新) a[j][i][k][l]

        12
  •  0
  •   Alejandro Cámara    14 年前

    用这个程序能解决吗?

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

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

        13
  •  0
  •   Anon    14 年前

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

    最后,一旦我对算法和数据进行了调试,我就会考虑在一台可以在内存中保存所有数据的机器上争取时间。 Amazon EC2

        14
  •  0
  •   Joel Hoff    14 年前

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

    • 数据访问顺序/引用位置:数据是否可以分离成独立的块,然后以独立或串行/顺序的方式进行处理 与。

    • CPU与I/O的界限:处理时间花在计算数据或从存储器读写数据上更多吗?

    如果数据访问顺序基本上是随机的,那么您需要访问尽可能多的RAM和/或找到一种方法来至少部分地组织顺序,以便不需要同时在内存中存储那么多的数据。虚拟内存系统速度减慢 一旦超过物理RAM限制,就会发生重大交换。解决这方面的问题可能是最关键的问题。

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

    编程语言的选择实际上是