假设我有一个大小为9 GB的.txt文件。我只想读第n个MB。 (我知道n是什么)。但我的电脑只有4GB的RAM,所以我无法一次加载所有文件。我需要多次访问不同的n。最好的方法是什么(我不知道标准ifstream能否做到这一点)。
答案 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位是 可用。
内存映射仅适用于整个内存页面。因此,地址 映射必须是页面对齐的,并且长度值将被舍入 起来。
更多信息: