我正在从文件中读取浮点数矩阵。矩阵的尺寸为4k * 4K。使用下面的程序,它只会导致now()函数奇怪地重置。如果我将矩阵大小减小到1k * 1K,它不会重置。虽然它正确地读取浮点数,但最后几个值是垃圾。我不知道这些垃圾价值来自哪里。我采用了BUFFSIZE 6的大小,因为浮动数字中的数字将大约为5-6。不确定它是否正确。
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <stdlib.h>
#include <sstream>
#define ROWS 4000
#define COLS 4000
#define BUFFSIZE 6
//#define USE_FREAD
#define USE_MMAP
double now()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + tv.tv_usec / 1000000.;
}
int main()
{
double end_time;
double total_time;
int i, x, y, k;
for (k = 0; k < 1; k++)
{
double start_time = now();
FILE* in = fopen("resistence_file", "rb");
float arr[ROWS][COLS];
char temp[BUFFSIZE];
int val;
std::stringstream ss;
char* floats = (char*)mmap(
0,
ROWS * COLS * sizeof(float),
PROT_READ,
MAP_FILE | MAP_PRIVATE,
fileno(in),
0
);
fclose(in);
ss<<floats;
for (int i =0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
if ((ss.getline(temp, BUFFSIZE, ' ')) )
{
arr[i][j] = atof((temp));
}
}
}
for (int i =0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
printf("%.1f ", arr[i][j]);
}
printf("\n");
}
munmap(floats, ROWS * COLS * sizeof(float));
end_time = now();
total_time = end_time - start_time;
printf("It took %f seconds to read %d * %d matrix \n", total_time, ROWS, COLS);
}
return 0;
}
答案 0 :(得分:6)
float arr[4000][4000];
需要56Mb(假设sizeof(float)=4
)。这很可能比你的可用堆栈大。
您需要将arr
移动到静态持续时间
static float arr[ROWS][COLS];
...
int main()
或动态分配,记住以后free
int main()
{
float (*arr)[COLS] = malloc(sizeof(*arr) * ROWS);
....
free(arr);
答案 1 :(得分:0)
sizeof(float)*K
字节的文件,就好像它包含二进制数据一样。如果它包含已知数量的二进制浮点数据,为什么要稍后使用它,就像它包含文本一样?如果它包含文本,它与sizeof(float)
有什么关系?你绝对确定你的浮点数占据了作为文本,sizeof(float)
字节平均,包括空格分隔符?大多数地方每个号码大约有3个非空白字符。ss
提供一个字符串,该字符串可能会或可能不会被NUL终止。与崩溃没有直接关系:这里stringstream
和getline
的整个业务完全浪费了时空(确定至少浪费了64兆字节的空间并至少浪费了一些时间) 。不是说atof
没有程序员应该用六英尺长的杆子接触。我希望你不要认真计划在生产代码中这样做。只需在原始数组上使用std::strtod
代替所有这些。