gpt4 book ai didi

c++ - C++读取超大文件的方法

转载 作者:可可西里 更新时间:2023-11-01 17:08:47 26 4
gpt4 key购买 nike

如果我有一个巨大的文件(例如 1TB,或任何不适合 RAM 的大小。文件存储在磁盘上)。它由空格分隔。我的内存只有 8GB。我可以在 ifstream 中读取该文件吗?如果不是,如何读取一个文件 block (例如 4GB)?

最佳答案

您可以做几件事。

首先,打开大于您拥有的 RAM 容量的文件没有问题。您不能做的是将整个文件实时复制到您的内存中。最好的办法是找到一种方法一次只读取几个 block 并处理它们。您可以为此目的使用 ifstream(例如 ifstream.read)。分配,比如说,一兆字节的内存,将该文件的第一个兆字节读入其中,冲洗并重复:

ifstream bigFile("mybigfile.dat");
constexpr size_t bufferSize = 1024 * 1024;
unique_ptr<char[]> buffer(new char[bufferSize]);
while (bigFile)
{
bigFile.read(buffer.get(), bufferSize);
// process data in buffer
}

另一种解决方案是将文件映射到内存。大多数操作系统都允许您将文件映射到内存,即使它大于您拥有的物理内存量。这是可行的,因为操作系统知道与文件关联的每个内存页面都可以按需映射和取消映射:当您的程序需要特定页面时,操作系统会将其从文件中读入您的进程内存并换出一个页面好久没用了。

但是,这只有在文件小于您的进程理论上可以使用的最大内存量时才有效。对于 64 位进程中的 1TB 文件,这不是问题,但它不适用于 32 位进程。

还有 be aware of the spirits that you're summoning .内存映射文件与从中读取文件不同。如果该文件突然被另一个程序截断,您的程序很可能会崩溃。如果你修改了数据,如果你不能存回磁盘,你可能会用完内存。此外,您的操作系统用于内存分页和分页的算法可能不会以对您有显着优势的方式运行。由于这些不确定性,只有在使用第一种解决方案无法按 block 读取文件时,我才会考虑映射文件。

在 Linux/OS X 上,您可以使用 mmap。在 Windows 上,您将打开一个文件,然后使用 CreateFileMapping,然后使用 MapViewOfFile

关于c++ - C++读取超大文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34751873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com