文件显示在 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。
框架挑战:你为什么要读取这么大的文件?考虑使用
CreateFileMapping
/ MapViewOfFile
进行内存映射。
此外,您可以在循环中调用
ReadFile
- 并不是您需要的,因为 3.1 GiB 文件完全在 32 位无符号整数的范围内。