malloc有时会失败。或者,pread有时会失败
因此,我有一个测试程序,它将大量数据读入缓冲区,并对 相应地缓冲。然而,它在大尺寸上失败了 有办法解决这个问题吗 谢谢你的回复 设备/dev/sdc是一个2TB的磁盘 下面是ready 2编译代码: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_
#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);