Mmap 4K * 4K плавает, что приводит к ошибке сегментации

Я читаю матрицу поплавков из файла. Размеры матрицы 4к * 4К. В приведенной ниже программе это просто странно приводит к сбросу функции 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

Решение

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);
6

Другие решения

  1. Вы отображаете файл sizeof(float)*K байт, как если бы он содержал двоичные данные. Если он содержит известное количество двоичных данных с плавающей запятой, почему вы пытаетесь работать с ним позже, как если бы он содержал текст? Если он содержит текст, то при чем тут sizeof(float)? Вы абсолютно уверены, что ваши числа с плавающей запятой занимают, как текст, sizeof(float) байт в среднем, включая пробел? Это примерно 3 непустых символа на число в большинстве мест.
  2. Вы кормите ss строка, которая может или не может быть завершена NUL.

Не имеет прямого отношения к катастрофе: весь этот бизнес stringstream а также getline здесь полная трата пространства-времени (хорошо, по крайней мере, трата 64 мегабайт пространства и, по крайней мере, некоторого времени). Не говоря о atof который ни один программист не должен касаться шестом футов длиной. Я надеюсь, что вы серьезно не планируете делать это в рабочем коде. Просто используйте std::strtod на исходном массиве вместо всего этого.

0

По вопросам рекламы [email protected]