私は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++でデータを保存する別の方法があります。いつでも使用できますか?
ありがとうございます。
'std :: array、length_grid1> M1_BETA;は通常、スタックでインスタンス化されます。 –
大きなデータの場合は 'std :: vector'を使うべきです。 – NathanOliver
これはstd :: vectorと連携しています。本当にありがとうございます!配列との違いは何ですか? –