内存分配问题,请帮忙。

脑谭 2014-03-19 10:29:43

定义了一个结构体,想从文件中读出数据存在里面

const int DATA_ROWS = 60*1024*1024;
const int DATA_COLUMNS = 20;

typedef struct COL_MEM
{
char* Col_index;
double* data;
int cols;
}ColMEM,*pColMEM;

数组data用于存储数据,只能分配出前三列的data,之后的没有分配,以下是代码:

//分配结构体内存
//[DATA_COLUMNS];// = new pColMEM[DATA_COLUMNS];//(pColMEM*)malloc(DATA_COLUMNS * sizeof(ColMEM));
for(int i =0; i< DATA_COLUMNS; i++)
mem[i] = (pColMEM)malloc(/*DATA_COLUMNS * */sizeof(ColMEM));
for(int ii =0; ii< DATA_COLUMNS; ii++)
mem[ii]->data = (double*)malloc(DATA_ROWS*sizeof(double));//new double[DATA_ROWS];//(double*)malloc(DATA_ROWS*sizeof(double));
while(!feof(fp))
{
for(int i =0; i< DATA_COLUMNS; i++)
{
fscanf(fp,"%lf",&rdata);
mem[i]->data[cur_row]=rdata;
//ar.data[cur_row] = data;
}
cur_row++;
mem[i]->cols = cur_row;
}
...全文
138 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
脑谭 2014-03-19
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
如果真想在32位系统中操作超过4GB的存储对象的话,使用文件读写模拟内存读写。 参考_lseeki64函数。
打算暂时不读那么多数据,我现在就想知道为啥可以分配出前三个的内存。
赵4老师 2014-03-19
  • 打赏
  • 举报
回复
如果真想在32位系统中操作超过4GB的存储对象的话,使用文件读写模拟内存读写。 参考_lseeki64函数。
脑谭 2014-03-19
  • 打赏
  • 举报
回复
我算了下,分配的内存大概占6G多,超出寻址空间了,但是问题是为什么前三个可以分配,后面的不能。 我试过好几次,都是只有前三个可以分配。
waterSStreaming 2014-03-19
  • 打赏
  • 举报
回复
先计算一下你这个到底需要分配多大空间的好,如果真的没问题的话,你计算机的内存够大的...
脑谭 2014-03-19
  • 打赏
  • 举报
回复

这是debug截图
赵4老师 2014-03-19
  • 打赏
  • 举报
回复
或者是按1024和按1000算的区别。 另外管理一块内存还需要若干多出的字节,大概是16~32字节吧。 VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
赵4老师 2014-03-19
  • 打赏
  • 举报
回复
引用 9 楼 ztanap 的回复:
多谢。 按照大小算,60M行数据,每行double占8位。 每列占内存480M,三列占1.44G。你的程序分了1.509G 请问为什么多占了大概60M的空间。
操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
脑谭 2014-03-19
  • 打赏
  • 举报
回复
多谢。 按照大小算,60M行数据,每行double占8位。 每列占内存480M,三列占1.44G。你的程序分了1.509G 请问为什么多占了大概60M的空间。
脑谭 2014-03-19
  • 打赏
  • 举报
回复
哦,,是第四个就超过2G了啊?
脑谭 2014-03-19
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
我的电脑2G内存的运行结果: // [/code]
所以你也是到第三个数据时候溢出的。什么原因呢
赵4老师 2014-03-19
  • 打赏
  • 举报
回复
我的电脑2G内存的运行结果:
#include <stdio.h>
#include <stdlib.h>
const int DATA_ROWS = 60*1024*1024;
const int DATA_COLUMNS = 20;
typedef struct COL_MEM
{
    char* Col_index;
    double* data;
    int cols;
}ColMEM,*pColMEM;
pColMEM mem[DATA_COLUMNS];
unsigned __int64 t;
int main() {
//  分配结构体内存
//  [DATA_COLUMNS];// = new pColMEM[DATA_COLUMNS];//(pColMEM*)malloc(DATA_COLUMNS * sizeof(ColMEM));
    t=0ui64;
    for(int i =0; i< DATA_COLUMNS; i++) {
        mem[i] = (pColMEM)malloc(/*DATA_COLUMNS * */sizeof(ColMEM));
        if (NULL==mem[i]) {
            printf("malloc mem[%d] fail!\n",i);
            exit(1);
        }
        t+=(unsigned __int64)sizeof(ColMEM);
        printf("malloc mem[%d] succ,total malloc %I64u bytes\n",i,t);
    }
    for(int ii =0; ii< DATA_COLUMNS; ii++) {
        mem[ii]->data = (double*)malloc(DATA_ROWS*sizeof(double));//new double[DATA_ROWS];//(double*)malloc(DATA_ROWS*sizeof(double));
        if (NULL==mem[ii]->data) {
            printf("malloc mem[%d]->data fail!\n",ii);
            exit(2);
        }
        t+=(unsigned __int64)DATA_ROWS*sizeof(double);
        printf("malloc mem[%d]->data succ,total malloc %I64u bytes\n",ii,t);
    }
    return 0;
}
//malloc mem[0] succ,total malloc 12 bytes
//malloc mem[1] succ,total malloc 24 bytes
//malloc mem[2] succ,total malloc 36 bytes
//malloc mem[3] succ,total malloc 48 bytes
//malloc mem[4] succ,total malloc 60 bytes
//malloc mem[5] succ,total malloc 72 bytes
//malloc mem[6] succ,total malloc 84 bytes
//malloc mem[7] succ,total malloc 96 bytes
//malloc mem[8] succ,total malloc 108 bytes
//malloc mem[9] succ,total malloc 120 bytes
//malloc mem[10] succ,total malloc 132 bytes
//malloc mem[11] succ,total malloc 144 bytes
//malloc mem[12] succ,total malloc 156 bytes
//malloc mem[13] succ,total malloc 168 bytes
//malloc mem[14] succ,total malloc 180 bytes
//malloc mem[15] succ,total malloc 192 bytes
//malloc mem[16] succ,total malloc 204 bytes
//malloc mem[17] succ,total malloc 216 bytes
//malloc mem[18] succ,total malloc 228 bytes
//malloc mem[19] succ,total malloc 240 bytes
//malloc mem[0]->data succ,total malloc 503316720 bytes
//malloc mem[1]->data succ,total malloc 1006633200 bytes
//malloc mem[2]->data succ,total malloc 1509949680 bytes
//malloc mem[3]->data fail!
//

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧