#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <iostream>
using namespace std;
#define FILEPATH "file.txt"
#define NUMINTS (268435455)
#define FILESIZE (NUMINTS * sizeof(int))
int main()
{
int i=sizeof(int);
int fd;
double *map; //mmapped array of int's
fd = open(FILEPATH, O_RDONLY);
if (fd == -1) {
perror("Error opening file for reading");
exit(EXIT_FAILURE);
}
map = (double*)mmap(0, FILESIZE, PROT_READ, MAP_SHARED, fd, 0);
if (map == MAP_FAILED) {
close(fd);
perror("Error mmapping the file");
exit(EXIT_FAILURE);
}
for (i = 100000; i <=100100; ++i) {
cout<<map[i]<<endl;
}
if (munmap(map, FILESIZE) == -1) {
perror("Error un-mmapping the file");
}
close(fd);
return 0;
}
我收到文件大小太大的错误。
答案 0 :(得分:1)
您应该检查您的mmap
- ed文件是否足够大。
并确保FILESIZE
是int64_t
个号码(您需要#include <stdint.h>
):
#define FILESIZE ((int64_t)NUMINTS * sizeof(int))
在mmap
来电之前和成功open
之后,使用fstat(2)添加以下代码:
struct stat st={0};
if (fstat(fd, &st)) { perror("fstat"); exit (EXIT_FAILURE); };
if ((int64_t)st.st_size < FILESIZE) {
fprintf(stderr, "file %s has size %lld but need %lld bytes\n",
FILEPATH, (long long) st.st_size, (long long) FILESIZE);
exit(EXIT_FAILURE);
}
最后,使用g++ -Wall -g
编译您的程序并使用gdb
调试器。此外,strace(1)
可能很有用。并确保当前目录的文件系统可以处理大文件。
您可能需要或需要定义_LARGEFILE64_SOURCE
(和/或_GNU_SOURCE
),例如用g++ -Wall -g -D_LARGEFILE64_SOURCE=1
编译;见lseek64(3)&amp; feature_test_macros(7)
谷歌搜索
Value too large for defined data type
给出了很快this coreutils FAQ的详细解释。您可能应该安装64位Linux发行版(或者至少重新编译适当配置的coreutils,或者使用不同的文件系统......)
答案 1 :(得分:0)
当我尝试处理2,626,351,763字节文件时(除了符合有符号的32位整数),我就有了这个。当我使用cc -m64重新编译程序时,问题就消失了(我正在使用Sun C 5.13 SunOS_sparc 2014/10/20编译器)。
64位系统很乐意处理大(> 2 ^ 32字节)文件,但如果应用程序是以32位模式编译的,那就不那么多了。