malloc有时会失败。或者,pread有时会失败

malloc有时会失败。或者,pread有时会失败,c,linux,memory-management,malloc,C,Linux,Memory Management,Malloc,因此,我有一个测试程序,它将大量数据读入缓冲区,并对 相应地缓冲。然而,它在大尺寸上失败了 有办法解决这个问题吗 谢谢你的回复 设备/dev/sdc是一个2TB的磁盘 下面是ready 2编译代码: #define _FILE_OFFSET_BITS 64 #define BLKGETSIZE64 _IOR(0x12,114,size_

因此,我有一个测试程序,它将大量数据读入缓冲区,并对 相应地缓冲。然而,它在大尺寸上失败了

有办法解决这个问题吗

谢谢你的回复

设备/dev/sdc是一个2TB的磁盘

下面是ready 2编译代码:

#define          _FILE_OFFSET_BITS                            64     
#define          BLKGETSIZE64                                _IOR(0x12,114,size_t)    
#define          _POSIX_C_SOURCE                             200809L

#include <stdio.h>    
#include <inttypes.h>    
#include <stdlib.h>    
#include <fcntl.h>    
#include <unistd.h>

int readdata(int fp,uint64_t seekpoint, uint64_t seekwidth) {

    int16_t  *buf;

    buf=(int16_t *)malloc(seekwidth*sizeof(int16_t)+1);
    if (buf==0) {
      printf("ERROR malloc(%"PRIu64")\n",seekwidth*(sizeof(int16_t)));
      return 3;
    }

    if (pread(fp,buf,seekwidth,seekpoint)==seekwidth) {
        printf("SUCCES READING AT: %"PRIu64"| WITH READ WIDTH: %"PRIu64"\n",seekpoint,seekwidth);
        free(buf);
        return 1;
    } else {
        printf("ERROR READING AT: %"PRIu64"| WITH READ WIDTH: %"PRIu64"\n",seekpoint,seekwidth);
        free(buf);
        return 2;
    }

}



int main() {
    uint64_t    readwith,
                offset;
    int         fp=open("/dev/sdc",O_RDWR);

    readwith=10000;   offset=0;
    readdata(fp,offset,readwith);
    readwith=100000;   offset=0;
    readdata(fp,offset,readwith);
    readwith=1000000;   offset=0;
    readdata(fp,offset,readwith);
    readwith=10000000;   offset=0;
    readdata(fp,offset,readwith);
    readwith=100000000;   offset=0;
    readdata(fp,offset,readwith);
    readwith=1000000000;   offset=0;
    readdata(fp,offset,readwith);
    readwith=10000000000;   offset=0;
    readdata(fp,offset,readwith);
    close(fp);

}
有时

ERROR malloc(2000000000)
ERROR READING AT: 0| WITH READ WIDTH: 10000000000

嗯,我想说你不能分配1000000000大小的内存,因为那是9536MIB,我猜你没有那么多RAM

<>你可以考虑使用.< /P>

核心是STXXL的C++标准模板的实现 用于外部内存(核心外)计算的库STL,即。E STXXL实现了可以处理大量数据的容器和算法 仅适用于磁盘的数据量


嗯,我想说你不能分配1000000000大小的内存,因为那是9536MIB,我猜你没有那么多RAM

<>你可以考虑使用.< /P>

核心是STXXL的C++标准模板的实现 用于外部内存(核心外)计算的库STL,即。E STXXL实现了可以处理大量数据的容器和算法 仅适用于磁盘的数据量

Doug-lea-malloc(dlmalloc)关于块的最小和最大大小

如果n为零,malloc返回最小大小的块。(最小尺寸 在大多数32位系统上为16字节,在64位系统上为32字节。) 请注意,size_t是一种无符号类型,因此使用参数调用 如果签名被解释为巨大的请求,则为否定 空间量,这通常会失败支持的最大值 n在不同系统中不同,**但在所有情况下都小于最大值 尺寸的可表示值\u t

最大块大小可以是(2^31)及其左右2147483648

因此,在您的情况下,最后一次成功的malloc调用是针对100000000*2,大于最大值,因此malloc返回空值。

Doug lea malloc(dlmalloc)关于块的最小和最大大小

如果n为零,malloc返回最小大小的块。(最小尺寸 在大多数32位系统上为16字节,在64位系统上为32字节。) 请注意,size_t是一种无符号类型,因此使用参数调用 如果签名被解释为巨大的请求,则为否定 空间量,这通常会失败支持的最大值 n在不同系统中不同,**但在所有情况下都小于最大值 尺寸的可表示值\u t

最大块大小可以是(2^31)及其左右2147483648


因此,在您的情况下,最后一次成功的malloc调用是针对100000000*2,大于最大值,因此malloc返回空值。

如果您想处理整个磁盘或大型文件上的数据,可能需要使用
mmap(2)

从手册页:

mmap()
在的虚拟地址空间中创建一个新映射 呼叫过程


如果您希望能够写入磁盘,事情会变得更加棘手和危险,但这也是可能的(有关更多详细信息,请参阅
mmap(2)
手册页)。

如果您想处理整个磁盘或大文件上的数据,您可能需要使用
mmap(2)

从手册页:

mmap()
在的虚拟地址空间中创建一个新映射 呼叫过程


如果您希望能够写入磁盘,事情会变得更加棘手和危险,但这也是可能的(有关更多详细信息,请参阅
mmap(2)
手册页)。

因为这是/dev/sdc,我猜它是闪存驱动器?也许你正试图分配比它更多的内存?还有,它在哪一边失败?它是一个2TB的磁盘,我在我的系统上添加了输出。在
malloc
pread
等出现故障时,您应该打印
strerror(errno)
。既然这是/dev/sdc,我猜它是一个闪存驱动器?也许你正试图分配比它更多的内存?另外,它在哪一边失败?它是一个2TB的磁盘,我在我的系统上添加了输出。在
malloc
pread
等出现故障时,您应该打印
strerror(errno)
,这似乎是个好主意。但是,如果我关闭fd或磁盘从系统中移除,它将如何处理?为什么在完成fd之前要关闭fd?至于如果磁盘被移除,您的程序在尝试访问它时可能会收到类似于
SIGBUS
SIGSEGV
的信号(您可能能够捕获并处理)。如果你认为这是一个可能的可能性,那么你可能还没有解释你到底想做什么。这似乎是个好主意。但是,如果我关闭fd或磁盘从系统中移除,它将如何处理?为什么在完成fd之前要关闭fd?至于如果磁盘被移除,您的程序在尝试访问它时可能会收到类似于
SIGBUS
SIGSEGV
的信号(您可能能够捕获并处理)。如果你认为这是一种可能,那么你可能还没有解释你实际上想做什么。
ERROR malloc(2000000000)
ERROR READING AT: 0| WITH READ WIDTH: 10000000000
int fd = open("/dev/sdc", O_RDONLY);
unsigned char *data = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, 0);