簡體   English   中英

4k * 4k的mmap浮動導致分段錯誤

[英]mmap of 4k * 4K floats leading to segmentation fault

我正在從文件讀取浮點矩陣。 矩陣尺寸為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;
}

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. 您正在映射一個sizeof(float)*K字節的文件,就好像它包含二進制數據一樣。 如果它包含已知數量的二進制浮點數據,那么為什么以后要嘗試像對待文本一樣使用它呢? 如果包含文本,那么它與sizeof(float)什么關系? 您是否絕對確定您的浮點數平均占text sizeof(float)包括空格定界符sizeof(float)個字節? 在大多數情況下,每個數字大約3個非空白字符。
  2. 您正在輸入ss可能不為NUL終止的字符串。

與崩潰沒有直接關系:這里的整個stringstreamgetline業務都是對時空的完全浪費(可以,至少浪費64兆字節的空間,至少要浪費一些時間)。 atof程序員不應該用六英尺長的桿觸碰到的頂點。 希望您不要認真計划在生產代碼中這樣做。 只需在原始數組上使用std::strtod代替所有這些即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM