Я получил огромный текстовый файл, загруженный в объект CMemFile
, и хотел бы проанализировать его построчно (разделенный символами новой строки).
Первоначально это zip-файл на диске, и я разархивирую его в память, чтобы проанализировать его, поэтому CMemFile.
Один из рабочих способов читать построчно: m_file - это умный указатель на CMemFile
):
CArchive archive(m_file.get(), CArchive::load);
CString line;
while(archive.ReadString(line))
{
ProcessLine(string(line));
}
Поскольку это занимает много времени, я попытался написать свою собственную программу:
const UINT READSIZE = 1024;
const char NEWLINE = '\n';
char readBuffer[READSIZE];
UINT bytesRead = 0;
char *posNewline = NULL;
const char* itEnd = readBuffer + READSIZE;
ULONGLONG currentPosition = 0;
ULONGLONG newlinePositionInBuffer = 0;
do
{
currentPosition = m_file->GetPosition();
bytesRead = m_file->Read(&readBuffer, READSIZE);
if(bytesRead == 0) break; // EOF
posNewline = std::find(readBuffer, readBuffer + bytesRead, NEWLINE);
if(posNewline != itEnd)
{
// found newline
ProcessLine(string(readBuffer, posNewline));
newlinePositionInBuffer = posNewline - readBuffer + 1; // +1 to skip \r
m_file->Seek(currentPosition + newlinePositionInBuffer, CFile::begin);
}
} while(true);
Измерение производительности показало, что оба метода занимают примерно одно и то же время ...
Можете ли вы вспомнить какие-либо улучшения производительности или более быстрый способ анализа?
Спасибо за любой совет