4

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 プロジェクトにも設定する必要があるかどうか、またはこれを行う方法がわかりません。

アドバイスや助けをいただければ幸いです。

4

1 に答える 1

1

Neil Kirk が指摘しているように、この MSDN ページに記載されているように、32 ビット プロセスは 2 GB のメモリに制限されています。これは、無人およびマネージド アプリケーションに当てはまります。

これには多くのSOの質問があります。たとえば、私はこれらを見つけました:

64 ビット オペレーティング システムで 32 ビット プロセスがアクセスできるメモリの量はどれくらいですか?

Windows 上の単一プロセスがアドレス指定できるメモリの最大量

最大メモリ使用量の設定 C#

私の場合、.NET とアンマネージ コード間の相互運用性が何らかのバッファリングを行っているため、利用可能なメモリを消費していると思います。理想的には、2,600,000 x 10 要素の 2D ベクトルを 2 つまたは 3 つだけ持つ必要があります (double が 8 バイトの場合、これはまだ 1 GB 未満です)。これについてはさらに調査する必要があります。

于 2015-03-12T15:16:32.950 に答える