std::bad_alloc例外をスローしている次のコードがあります。
std::vector<std::vector<double>> myVector(nlines);
for(int i = 0; i < nlines; i++)
{
try
{
std::vector<double> iVector(ncolumns);
myVector[i] = iVector;
}
catch (std::exception& e)
{
/* catches a bad_alloc here */
}
}
}
このコードnlinesは、約 500,000 (ncolumns通常は 10 未満) のときに機能するようですが、フル サイズのデータ セットでこれを試したところ、nlines= 2,600,000 で bad_alloc 例外が発生しました。
私は 12 GB のメモリを持っており、プログラムの実行時にメモリ使用量を見ると、28% (開始前) から最大 42% (例外がスローされたとき) になります。そのため、まだメモリが使用可能であるように見えます。
ベクトルがメモリをヒープに割り当てるというこの投稿を見つけました。この MSDN ページにリンクしているこの投稿によると、コードで使用できるヒープの量 (バイト単位) を設定できます。最初、ヒープ コミット サイズとヒープ予約サイズは空白でした。2000000000 (2 GB) の値を入力しても、同じ問題が発生します。
興味深いことに、この C++ コード (CLI ではない) は、C#.NET アプリケーションからの相互運用機能を使用して呼び出されています。Heap Commit Size と Heap Reserve Size への変更は、C++ プロジェクトで設定されました。これらを .NET プロジェクトにも設定する必要があるかどうか、またはこれを行う方法がわかりません。
アドバイスや助けをいただければ幸いです。