visual-studio - 如何增加 Visual Studio C++ 中的内存限制

标签 visual-studio memory-management

需要帮助。我在 Windows-Visual Studio 上运行 C++ 代码时遇到问题。

当我在 Linux 环境中运行该代码时,我可以动态分配的内存没有限制(直到 RAM 中可用的大小)。

但是在 VS Compiler 上,它不允许我创建超出限制大小的数组。 我尝试过/F 选项和 20-25 个 google 链接来增加内存大小,但它们似乎没有多大帮助。

我目前只能分配 3GB 可用空间中的大约 100MB。

如果 Windows 中有一个解决方案,而不是 Visual Studio 的编译器,我会很高兴听到这个消息,因为我有一张 CUDA TeslaC2070 卡,事实证明它在 Windows 上毫无用处,因为我想运行我的 CUDA/Windows环境下的C++代码。

这是我的代码。当 LENGTH>128 时它会失败(没有图像 640x480pngs。每个图像小于 0.5mb。我还通过计算 OpenCV 和我使用的数据结构和类型来计算它所需的大致内存大小,但它仍然小于 2GB) 。堆栈溢出异常。与动态分配相同。我已经最大化了堆和堆栈的大小。

#include "stdafx.h"

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

#include <cuda.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#define LENGTH 100
#define SIZE1 640   
#define SIZE2 480
#include <iostream>
using namespace std;


__global__ void square_array(double *img1_d, long N)
{

int idx = blockIdx.x * blockDim.x + threadIdx.x;

img1_d[idx]= 255.0-img1_d[idx];

}


int _tmain(int argc, _TCHAR* argv[])
{   
        IplImage *img1[LENGTH];
        // Open the file.
        for(int i=0;i<LENGTH;i++)
        {   img1[i] = cvLoadImage("abstract3.jpg");}




    CvMat *mat1[LENGTH];
    for(int i=0;i<LENGTH;i++)
    {
        mat1[i] = cvCreateMat(img1[i]->height,img1[i]->width,CV_32FC3 );
        cvConvert( img1[i], mat1[i] );
    }


    double a[LENGTH][2*SIZE1][SIZE2][3];

    for(int m=0;m<LENGTH;m++)
    {
    for(int i=0;i<SIZE1;i++)
    {
         for(int j=0;j<SIZE2;j++)
         {
               CvScalar scal = cvGet2D( mat1[m],j,i);
               a[m][i][j][0] = scal.val[0];
               a[m][i][j][1] = scal.val[1];
               a[m][i][j][2] = scal.val[2];

               a[m][i+SIZE1][j][0] = scal.val[0];
               a[m][i+SIZE1][j][1] = scal.val[1];
               a[m][i+SIZE1][j][2] = scal.val[2];

            }

    }   }

//cuda
double *a_d;
int N=LENGTH*2*SIZE1*SIZE2*3;

cudaMalloc((void **) &a_d, N*sizeof(double));
cudaMemcpy(a_d, a, N*sizeof(double), cudaMemcpyHostToDevice);
int block_size = 370;
int n_blocks = N/block_size + (N%block_size == 0 ? 0:1);
cout<<n_blocks<<block_size;
square_array <<< n_blocks, block_size >>> (a_d, N);
cudaMemcpy(a, a_d, N*sizeof(double), cudaMemcpyDeviceToHost);

//cuda end



char name[]= "Image: 00000";
name[12]='\0';
int x=0,y=0;
for(int m=0;m<LENGTH;m++)
{
for (int i = 0; i < img1[m]->width*img1[m]->height*3; i+=3) 
{ 
 img1[m]->imageData[i]= a[m][x][y][0];
 img1[m]->imageData[i+1]= a[m][x][y][1];
 img1[m]->imageData[i+2]= a[m][x][y][2];

  if(x==SIZE1)
  {
  x=0;
  y++;
  }
x++;
}

    switch(name[11])
    {
        case '9': switch(name[10])
        {
            case '9': 
            switch(name[9])
            {
                case '9': name[11]='0';name[10]='0';name[9]='0';name[8]++;
                break;
                default : name[11]='0';
                name[10]='0';
                name[9]++;
            }break;

            default : name[11]='0'; name[10]++;break;
            }

            break;
        default : name[11]++;break;
    }
        // Display the image.
        cvNamedWindow(name, CV_WINDOW_AUTOSIZE);
        cvShowImage(name,img1);
    //cvSaveImage(name ,img1);
}
        // Wait for the user to press a key in the GUI window.
        cvWaitKey(0);

        // Free the resources.
        //cvDestroyWindow(x);
        //cvReleaseImage(&img1);
    //cvDestroyWindow("Image:");
        //cvReleaseImage(&img2);

        return 0;
}

最佳答案

问题是您在主函数的堆栈上分配了一个巨大的多维数组(double a[..][..][..])。不要在堆栈上分配这么多内存。使用malloc/new 在堆上分配。

关于visual-studio - 如何增加 Visual Studio C++ 中的内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9237184/

相关文章:

python - Python 何时为相同的字符串分配新内存?

linux - 对共享内存对象进行 ben mmap 后,ftruncate 是否安全?

c++ - 释放堆上的内存。我应该和如何?

android - Pushwoosh 泄漏我的 Activity

c - 为什么同一个 C 程序有时会快得多

c# - Server.Transfer 在 C# 代码中。服务器在当前上下文中不存在

c++ - ProjectName.exe已触发断点

wpf - "Live"Visual Studio 中 XAML 编辑器窗口中的数据和正在运行的应用程序

c++ - 无法弄清楚为什么使用 boost 库的多精度计算对我不起作用

visual-studio - 适用于Visual Studio 2019的Team Foundation Server Power Tools