【发布时间】:2016-05-16 13:08:57
【问题描述】:
我正在读取一个文件,其中输入元组的数量“n_tups”和单个元组的长度或其维度“d”。我已经为二维数组“元组”分配了如下内存。
当我运行代码时,我的计算机挂起,我不知道为什么。
if((fpp = fopen("in2.bin", "rb"))==NULL)
printf("file in2.bin doesn't exist!");
else
{
int **tuple;
unsigned long i;
tuple = malloc(n_tups * sizeof(int *));
if(tuple == NULL)
{
fprintf(stderr, "out of memory\n");
return;
}
for(i=0;i<n_tups;i++){
tuple[i]=malloc(d * sizeof(int));
if(tuple[i] == NULL)
{
fprintf(stderr, "out of memory\n");
return;
}
}
fseek( fpp , 0 , SEEK_SET );
printf("reading step");
for(i=0;i<n_tups;i++){
fread(&tuple[i],4,d,fpp);
fread(&score[i],8,1,fpp);
}
fclose(fpp);
}
我试图检查程序是否到达“读取步骤”,但它没有。原来它忙于分配内存! 我正在传递 d=3 n_tups=85013600 并且我的计算机有 4 GB 的 RAM。
【问题讨论】:
-
n_tups和d传递了什么?你的电脑有多少内存? -
为什么是
4和8而不是sizeof(_something_)? -
@chux 它已被制造商指定为此 bin 文件的属性
-
@She 你错过了 chux 的观点:你的程序应该有一个正确大小的相应数据结构。那么你就不需要“幻数” 4 和 8。想到
int32_t和int64_t。 -
另见Is malloc slow?。假设 150 万 malloc/秒,您的循环将花费 57 秒。假设 300 000 malloc/秒,您的循环将花费 284 秒。
标签: c file-handling