我正在使用以下代码将文件读入字符数组。现在,对于小文件(比如2 MB),它可以正常执行,但是对于大文件(140 MB),在我的18 GB UBUNTU服务器上,它会出现分段错误
。有人能帮助我解决这个问题吗?我认为18 GB足以将240 MB的文件存储到内存中。我正在使用64位UBUNTU并使用g ++编译。
ifstream is;
char chararray [fileSize] ;
is.read(chararray, fileSize) ;
ulimit
是一种不太优雅的非可移植解决问题的方式,而在代码本身中同样可以轻松地管理这个问题。 - Richardstd::vector
可能更好。但是了解ulimit
也没有错。 - James Kanzemmap()
是最好的选择。这不仅涉及内存开销,还涉及执行时间。从我的观点来看,如果只需要读取数据,这更加优雅。 - peterphnew[]
*(当然还有malloc……)*的方法。 - HostileFork says dont trust SEmmap
函数,并在析构函数中使用munmap
函数。并且可能会给这个类一个接口,使其尽可能接近std::vector
或std::array
的接口,以便用户感到熟悉。但由于涉及到的工作量,我建议只需读入std::vector
,直到需要性能时再使用该类(但如果我需要它一次,我会将该类放入我的工具包中,并立即使用它)。 - James Kanze不要在栈上分配char数组,建议使用std::vector
,它会在堆上进行动态分配:
std::vector<char> buffer(fileSize);
is.read(&buffer[0], fileSize);
gcc -Wall test.c
size
这是一个普通的C程序!由于您没有指定任何参数,它会将./a.out作为默认参数!
如果您需要应用一些优化,代码将变得如下所示...
praveenvinny@ubuntu:~/Project/New$> gcc -Wall -o1 -fauto-inc-dec test.c -o Output
praveenvinny@ubuntu:~/Project/New$> size output
text data bss dec hex filename
1067 256 8 1331 533 output
time -f "%e" -o Output.log ./a.out
将执行时间打印到名为Output.log的日志文件中
fileSize
应该是一个值为240*1024*1024
的size_t
类型... - Mr.C64char* chararray = new char[fileSize];
。 - Good Night Nerd Pridedelete[]
来代替delete
。相比之下,向量更好...而且从C++11开始,甚至可以在不付出复制开销的情况下从函数中返回大型向量,这要归功于返回值优化期间发生的复制省略。 - HostileFork says dont trust SE