【问题标题】:Data structure for large 2D array data大型二维数组数据的数据结构
【发布时间】:2018-12-02 06:42:26
【问题描述】:

我使用一个输出二维数据数组的模拟,其中每一列是一个不同的模拟变量(大约 50,000 个变量),每一行是每个时间样本(不同,但通常有 10,000 个或更多时间点)。

需要通过两种不同的方式访问这些数据:要么获取少量变量的整个时间序列,要么获取特定时间点的每个变量。换句话说,有时我需要从数据中读取列,有时我需要读取行。

目前,模拟以行优先顺序输出二进制格式。这使得获取特定时间的每个变量变得容易,但是读取单个变量的整个时间序列非常慢,因为数据分布在整个千兆字节大小的文件中。

是否有某种数据结构可以帮助我?我知道我可以有效地将文件大小加倍并以行优先和列优先顺序存储数据,但是文件已经很大了。

我已经查看了这里的其他一些问题,但似乎没有一个解决这个特定的用例。

【问题讨论】:

  • 从您告诉我们的情况来看,我想您的典型数据文件约为 4GB。考虑到当前磁盘存储的成本,这真的太多了吗? Crikey,如今 16GB RAM 的笔记本电脑没什么特别的,你可以在内存中保存两次数据!我可以保证没有人会提供一种聪明的数据结构,当您以“正确”顺序读取文件以从磁盘顺序流式传输数据时,它会提供与当前相同的行和列访问速度。
  • 不幸的是,我们每天都会运行很多很多模拟。管理层不会批准遥测数据突然翻倍。在我们的网络中,我们不仅需要两倍的硬盘,而且还需要两倍的磁带备份。
  • 不是说它非常相关,但是为什么您需要两倍的磁带备份?

标签: data-structures language-agnostic


【解决方案1】:

只是免责声明-我不建议在您的程序中实现此数据结构。它在行访问上浪费的时间比在列访问上节省的时间要多。但是,如果您无法增加内存大小,并且如果您绝对必须改进列访问(例如,为了防止在其他地方停滞),它似乎是您唯一的选择,那么它可能是您唯一的选择。

您可以调整 2D 数组,以使从行读取和从列读取都比从列读取更快,但是从行读取会严重影响性能。这也确实意味着索引特定位置会更慢,但缓存未命中可能会产生更大的影响。

为简单起见,假设矩阵大小为 NxN,N 是一个完美的正方形。现在,我们可以将原始矩阵的第 i 行安排在每个i + k * sqrt(N) 元素的一维矩阵中。第 j 列将成批出现在 sqrt(N) 之间(并相交)这些行之间的延伸。比如floor(index / sqrt(N)) * N + index mod sqrt(N)。

这完成的是每 N 个元素,您现在拥有对应行和列的 sqrt(N) 个元素,而不是 N 个行元素,但只有 1 个列元素。当您拉入缓存行时,您现在将拥有每个元素中的几个(至少有几个缓存命中),无论您是遍历行还是列,而不是冒“全有或全无”的风险。这是否是一个好的权衡取决于您需要改善最坏情况性能的程度以及您对最佳情况性能的关注程度。

要将现有的 2D 数组转换为这种形式,您可以获取构成矩阵下半部分的行,并将它们的列与各自的上半部分行交错。然后取这个拉长矩阵的右半部分,并将其行与左半部分的行交错。重复sqrt(N) 次。请注意,这将非常慢 - 我不建议您使用它来转换您的数据库,我只是提供它作为理解数据结构的另一种方式。要转换数据库,我会计算公式,然后一个一个地移动每个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多