TSG*_*TSG 1 c++ qt file memory-mapped-files
我需要创建Qt5 / C ++的“ tail -5 myfile”等效项(不使用shell命令。我发现了几个stackoverflow引用,它们在文件结尾之前先查找X字节,然后再向前读取,但我希望有一些东西更好。
有可用的Qt功能更好的/更快的方法,还是文件的内存映射(一部分)?(有问题的文件可能很大,所以这必须相对提高内存效率)
如前所述sashoalm,使用seek()方法。例如:
QElapsedTimer tmr;
tmr.start();
QFile file("path");
if(file.open(QIODevice::ReadOnly))
{
qint64 num = 10;
qint64 fileSize = file.size();
qDebug() << fileSize;
file.seek(fileSize - num);
qDebug() << file.read(num);
qDebug() <<"reading took" << tmr.elapsed()<< "ms";
file.close();
}
Run Code Online (Sandbox Code Playgroud)
性能:
我的下一个输出与file ~11 Gb。
size 11768585585
"???G?t??"
reading took 23 ms
Run Code Online (Sandbox Code Playgroud)
程序没有增加RAM使用率。对于小文件,(~1Gb)我有0ms。我认为这是正常速度。
编辑:
接下来是用Qt做诸如tail实用程序之类的方法。我不认为这种方式非常正确并且性能很高,但是它比读取所有文件并进行解析要好。我们无法使用某种魔术readLineFromEnd()方法从头开始读取文件,因此请尝试使用next:
QElapsedTimer tmr;
tmr.start();
QFile file("path");
if(file.open(QIODevice::ReadOnly))
{
file.seek(file.size()-1);
int count = 0;
int lines = 5;
while ( (count < lines) && (file.pos() > 0) )
{
QString ch = file.read(1);
file.seek(file.pos()-2);
if (ch == "\n")
count++;
}
qDebug() << file.readAll();
qDebug() <<"reading took" << tmr.elapsed()<< " ms";
file.close();
}
Run Code Online (Sandbox Code Playgroud)
8Kbtxt文件的输出:
reading took 2 ms .
Run Code Online (Sandbox Code Playgroud)
~8Mbtxt文件的输出(它是一个日志文件):
reading took 1 ms
Run Code Online (Sandbox Code Playgroud)
是的,它的性能较低,但这是复杂的任务。有趣的是,需要多少时间使用tail实用程序来执行此操作,但是无论如何,1毫秒和2毫秒都是(也许)好的结果。
| 归档时间: |
|
| 查看次数: |
5109 次 |
| 最近记录: |