文件显示的范围为 1.1GB-3.1GB。服务器有 64GB RAM(较小的服务器有 24GB)。
所以我想我只需将整个内容读入内存而不是使用块。(块可能会落在 crlf 位置之外,所以我必须稍微回溯。更简单的代码可以吞掉整个内容)。
ReadFile 和 ReadFileEx 似乎停留在 32 位领域,即使在 Win64 中构建也是如此。我觉得我错过了一些明显的东西。
#include <Windows.h>
#include <iostream>
using namespace std;
int main()
{
cout << "start\r\n";
HANDLE hInput;
hInput = CreateFile(L"My-giant-File.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
long long amountOfDataToRead = 4000000000; //Arbitrary 4Gb read buffer
byte * buffer = reinterpret_cast<byte*>(malloc(amountOfDataToRead));
DWORD bytesRead = 0;
ReadFile(hInput, buffer, amountOfDataToRead, &bytesRead, NULL);
//Perform operation on data
free(buffer);
CloseHandle(hInput);
}
参见上文:bytesRead 是一个双字型。我敢打赌我的输入 long long 只会被读为 long 。
ReadFile/Ex()
(以及一般的 I/O)永远无法保证读取与您要求的字节数完全相同的字节。它可能会读得更少,所以你必须准备好处理这种可能性。这就是为什么ReadFile/Ex()
报告它实际读取了多少字节。您需要通过循环调用它来考虑到这一点,以确保您阅读了您想要的所有内容,例如:框架挑战:你为什么要读取这么大的文件?考虑使用
CreateFileMapping
/进行内存映射MapViewOfFile
。另外,您可以
ReadFile
循环调用 - 并不是您需要的,因为 3.1 GiB 文件完全在 32 位无符号整数的范围内。