【问题标题】:Data structure for storing very large 2D data in C++用于在 C++ 中存储非常大的 2D 数据的数据结构
【发布时间】:2014-05-16 01:54:18
【问题描述】:

我需要处理最多 1 亿行和 30 列的数据表 (2D)。表格元素仅包含 0、1 和破折号 (-)。该表以文本文件的形式提供给我。我必须将这些数据存储到一些数据结构中并执行诸如排序表、删除行、比较元素(在不同的行和列中)等操作。

目前我正在为此使用 2D 矢量。我尝试使用整数向量和位向量。两者都适用于 1000 万行和 25 列,但都不适用于上述最大限制(我的分配错误)。

我假设这是因为向量需要连续的内存。什么是正确的数据结构?时间也是我的考虑因素之一,并且也需要较短的访问时间。此外,如果向量实际上是正确的数据结构,是否有更好的实现我可以用来完成这项工作?我必须坚持使用 C++,不能使用数据库和其他东西。

非常感谢!

【问题讨论】:

  • 如果您可以设计一个方案将您的 tribool 打包到 2 位存储中,您将需要大约 2.25GB 的存储空间。如果你要为你的 tribool 使用一个完整的字节,你需要大约 9GB。

标签: c++ multidimensional-array vector large-data


【解决方案1】:

查看 Nstate

它是一个用于任意基数的打包数组库(因此三态合格)。

http://nstate.hostilefork.com

免责声明:我写了 nstate。

【讨论】:

  • @TanmayPatil 感谢您指出澄清,但这不仅适用于三态,您选择基数并进行数学运算。因此是“N”状态。每个字节包含 4 个 4 状态,诸如此类。我的网站生成器降价也有一个错误,aaaargh。修复它。
  • 当然可以。我只是想避免这个有用的答案只是链接。
【解决方案2】:

你可以考虑boost::tribool的数组

您还可以考虑对std::bitset 进行包装,这样对于每个 tribool,bitset 中都有 2 个位。

tribool 大小为 N 需要 bitset 大小为 2*N

映射:

tribool(i) maps to bitset(2*i) and bitset(2*i+1)

if tribool(i) == indeterminate, then bitset(2*i) = false
if tribool(i) == true, then bitset(2*i) = true, bitset(2*i) = true
if tribool(i) == false, then bitset(2*i) = true, bitset(2*i) = false

C++ish 伪代码:

template<size_t N>
class PackedTribool {
public:
  ??? test( i ) {
    if( bits_[ 2 * i ] == false ) {
        return indeterminate;
    }
    else {
        return( bits_[ 2 * i + i ];
    }
  }
private:
  std::bitset<2*N> bits_;     // note: size is doubled
};

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 2022-01-03
    • 2015-03-11
    • 2011-05-14
    • 2010-12-15
    • 2023-03-16
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多