用c ++读取大文件

时间:2016-11-20 07:34:43

标签: c++ text-files filestream binaryfiles

假设我有一个大小为9 GB的.txt文件。我只想读第n个MB。 (我知道n是什么)。但我的电脑只有4GB的RAM,所以我无法一次加载所有文件。我需要多次访问不同的n。最好的方法是什么(我不知道标准ifstream能否做到这一点)。

2 个答案:

答案 0 :(得分:1)

你想"寻求"在文件中指定的位置。在使用ifstream的C ++中,您使用seekg()http://www.cplusplus.com/reference/istream/istream/seekg/

例如:

char data[1024*1024];
ifstream in("myfile.txt");
in.seekg(450 * 1024 * 1024, ios_base::beg); // skip 450 MB
if (in.read(data, sizeof(data)) {
    // use data
}

答案 1 :(得分:0)

你的操作系统是64位吗?如果是这样,请尝试 mmap()

  

在现代操作系统上,可以mmap(发音为   “em-map”)文件到内存区域。完成后,该文件   可以像程序中的数组一样访问。

     

这比读取或写入更有效,因为只有区域   加载程序实际访问的文件。访问   mmapped区域的尚未加载的部分以相同的方式处理   如换页。

     

由于mmapped页面可以在物理时存储回其文件   内存很低,有可能mmap文件的数量级更大   比物理内存和交换空间都要多。唯一的限制是   地址空间。 32位机器的理论限制为4GB -   但是,实际限制因为某些区域将会更小   保留用于其他目的。如果使用LFS接口的文件   32位系统上的大小不限于2GB(签名偏移量为   将4GB的可寻址面积减少一半);完整的64位是   可用。

     

内存映射仅适用于整个内存页面。因此,地址   映射必须是页面对齐的,并且长度值将被舍入   起来。

更多信息: