用于在C ++中存储非常大的2D数据的数据结构

时间:2014-04-03 23:58:36

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

我需要处理最多1亿行和30列的数据表(2D)。表元素仅包含0,1和短划线( - )。该表在文本文件中提供给我。我必须将这些数据存储到某些数据结构中,并执行排序表,删除行,比较元素(不同行和列)等操作。

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

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

非常感谢!

2 个答案:

答案 0 :(得分:6)

查看 Nstate

它是一个用于任意基数的Packed Arrays库(所以三态合格)。

http://nstate.hostilefork.com

免责声明:我写了nstate。

答案 1 :(得分:4)

您可以考虑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
};