用于存储数百万个int16的c ++数据结构

时间:2014-01-22 11:30:07

标签: c++ data-structures

下午好。 我有以下几种情况:有三组数据,每组是一个二维表,其中约有50万个字段。 (~6000行和~8000列)。 该数据存储在二进制文件中 语言 - c + +

我只需要显示这些数据。 但是当我试图阅读时我卡住了。(使用std :: vector但等待时间太长) 读取\存储这么多数据的最佳方法是什么? (std :: vectors,简单指针,特殊库)?

也许链接到文章,书籍或仅仅是个人经历?

2 个答案:

答案 0 :(得分:2)

好吧,如果你不需要同时使用所有这些数据,你可以使用内存映射文件技术并读取数据,因为它是一个巨大的数组。通常,操作系统/文件系统缓存适用于大多数应用程序,但肯定是YMMV。

答案 1 :(得分:1)

没有理由不在ifstream / ofstream上使用普通的旧读写。对于BigArray b(6000,8000),以下代码不需要很长时间;

#include <fstream>
#include <iostream>
#include <string>
#include <stdlib.h>

class BigArray {
public:
  BigArray( int r, int c ) : rows(r), cols(c){
    data = (int*)malloc(rows*cols*sizeof(int));
    if( NULL == data ){
      std::cout << "ERROR\n";
    }
  }
  virtual ~BigArray(){ free( data ); }

  void fill( int n ){
    int v = 0;
    int * intptr = data;
    for( int irow = 0; irow < rows; irow++ ){
      for( int icol = 0; icol < cols; icol++ ){
        *intptr++ = v++;
        v %= n;
      }
    }
  }

  void readFromFile( std::string path ){
    std::ifstream inf( path.c_str(), std::ifstream::binary );
    inf.read( (char*)data, rows*cols*sizeof(*data) );
    inf.close();
  }

  void writeToFile( std::string path ){
    std::ofstream outf( path.c_str(), std::ifstream::binary );
    outf.write( (char*)data, rows*cols*sizeof(*data) );
    outf.close();
  }

private:
  int rows;
  int cols;
  int* data;
};