2016-08-26 4 views
-1

私はC++にあった古いRコードをいくつかの速度を上げるために再現しようとしています。 このコードでは、事前ロードされたデータ(サイズが13689 x 126の6つの行列)を使用する必要があります(それぞれのサイズは.txtファイルで約28 MBです)。 Rにこれをメモリにロードしても何の問題も生じませんでした。C++で 'large'データファイルを読む

私は、これらのデータを事前にロードしようとするC++コードを作成しました(これは、あらかじめヘッダーファイルbtwにプリロードされていますか?)。私は、ファイル(インテルComposerを使用して)をコンパイルすることができますが、私は.exeファイルを起動すると、それは瞬時にクラッシュ:ダブルまたは配列を使用して

int i, j; 
const int length_grid1 = 13689; 
const int length_grid_pl = 126; 

ifstream in; 
//double M1_BETA[length_grid1][length_grid_pl]; // either this, or the other one 
std::array<std::array<int, length_grid_pl>, length_grid1> M1_BETA; 
in.open("preloaded_object/M1_BETA.txt"); 
for (i = 0; i < length_grid1; i++) { 
    for (j = 0; j < length_grid_pl; j++) { 
     in >> M1_BETA[i][j]; 
    } 
} 
in.close(); 

どちらのバージョンでは、動作しません。これは、ロードされた行列の1つだけで起こります...そして、それらのうちの6つをロードする必要があります。

自分のコードから問題が発生しているとは思えません。自分が問題なく実行するデータ次元を減らすと、問題になると思います。
すべてがロードされていない場合は、後でプログラムを実行できないことに注意してください。そして部分的に再読み込みするとペースがあまりにも減ります(計算速度を上げるためにC++に切り替えました)。

28MBが多すぎるため、プログラムがクラッシュしますか? Rには何の問題もないので奇妙だと思われます...

それ以外の場合は、メモリ内の場所が少なくなるようにプリロードできますか?後でデータの任意の行に簡単にアクセスする必要があります(セルごとのセルはそれほど重要ではなく、本当にすばやく特定の行にアクセスする必要があります)。

また、C++でデータを保存する別の方法があります。いつでも使用できますか?

ありがとうございます。

+1

'std :: array 、length_grid1> M1_BETA;は通常、スタックでインスタンス化されます。 –

+3

大きなデータの場合は 'std :: vector'を使うべきです。 – NathanOliver

+0

これはstd :: vectorと連携しています。本当にありがとうございます!配列との違いは何ですか? –

答えて