首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >4k * 4K浮点数的mmap导致分段故障

4k * 4K浮点数的mmap导致分段故障
EN

Stack Overflow用户
提问于 2013-06-18 23:25:49
回答 2查看 220关注 0票数 0

我正在从文件中读取浮点数矩阵。矩阵的维度为4K * 4k。使用下面的程序,它只是导致了奇怪的reset in now()函数。如果我将矩阵大小减少到1k * 1K,它不会重置。虽然它正确地读取了浮点数,但最后几个值是垃圾。我不知道这些垃圾价值是从哪里来的。我取了BUFFSIZE 6的大小,因为它在浮点数中的位数大约是5-6。不确定它是否正确。

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-18 23:29:24

float arr[4000][4000];将需要56Mb (假设为sizeof(float)=4)。这很可能比您的可用堆栈更大。

您需要移动arr以获得静态持续时间

代码语言:javascript
复制
static float arr[ROWS][COLS];
...
int main()

或者动态地分配它,记住以后再free

代码语言:javascript
复制
int main()
{
    float (*arr)[COLS] = malloc(sizeof(*arr) * ROWS);
    ....
    free(arr);
票数 6
EN

Stack Overflow用户

发布于 2013-06-19 02:05:12

  1. 您正在映射sizeof(float)*K字节的文件,就好像它包含二进制数据一样。如果它包含已知数量的二进制浮点数据,为什么要在以后尝试处理它,就好像它包含文本一样?如果它包含文本,那么它与sizeof(float)有什么关系?您确定浮点数平均占用文本sizeof(float)字节(包括空格分隔符)吗?在大多数情况下,每个数字大约有3个非空字符。
  2. 您正在向ss提供一个字符串,该字符串可能是,也可能不是

与崩溃没有直接关系:stringstreamgetline在这里的整个业务完全是对空间时间的浪费(好吧,至少浪费64MB的空间和至少一些时间)。更不用说atof了,任何程序员都不应该用一根六英尺长的杆子来触摸它。我希望您不会真的打算在生产代码中这样做。只需在原始数组上使用std::strtod来代替所有这些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17172834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档