Os arquivos aparecem na faixa de 1,1 GB a 3,1 GB. O servidor possui 64 GB de RAM (os servidores menores possuem 24).
Então, acho que vou ler tudo na memória, em vez de usar pedaços. (Pedaços podem cair fora da posição crlf, então eu teria que voltar um pouco. Código muito mais simples para engolir tudo).
ReadFile e ReadFileEx parecem presos em terras de 32 bits, mesmo quando construídos em Win64. Sinto que estou perdendo algo óbvio.
#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);
}
Veja acima: bytesRead é um DWord. E aposto que minha contribuição há muito tempo está sendo lida longamente.
ReadFile/Ex()
(e apenas E/S em geral) nunca tem garantia de ler exatamente quantos bytes você solicita. Pode ler menos, então você deve estar preparado para lidar com essa possibilidade. É por issoReadFile/Ex()
que informa quantos bytes ele realmente leu. Você precisa levar isso em consideração chamando-o em um loop para ter certeza de ler tudo o que deseja, por exemplo:Desafio do quadro: Por que você está lendo arquivos desse tamanho? Considere mapeá-los na memória usando
CreateFileMapping
/MapViewOfFile
.Além disso, você pode chamar
ReadFile
em um loop - não que seja necessário, pois um arquivo de 3,1 GiB está dentro do intervalo de um número inteiro não assinado de 32 bits.