gpt4 book ai didi

c++ - 逐行解析 CMemFile 中的文本

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

我已将一个巨大的文本文件加载到 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);

性能测量显示这两种方法花费的时间大致相同...

您能想到任何性能改进或更快的解析方法吗?

谢谢你的建议

最佳答案

一些可能有用的注释和评论:

  • 分析是确保了解代码在做什么以及需要多长时间的唯一方法。从代码本身来看,瓶颈往往并不明显。一种基本方法是分别对加载、解压缩和解析进行计时。
  • 从磁盘实际加载文件,在您的情况下是解压缩,实际上可能比解析花费更多的时间,尤其是当您的 ProcessFile() 函数是 nop 时。如果您的解析只占用总时间的 1%,那么您永远不会从尝试优化那 1% 中得到太多。这是分析您的代码会告诉您的信息。
  • 优化加载/解析算法的一般方法是查看特定字节被读取/解析的次数。最小且可能最快的算法必须只读取和解析每个字节一次。查看您的算法,每个字节似乎都被复制了六次,并且可能解析了类似的数字。减少这些数字可能有助于减少总体算法时间,尽管总体上相对增益可能不会太大。

关于c++ - 逐行解析 CMemFile 中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6187310/

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