问:我如何使用QT复制大数据?

Jos*_*Sun 2 c++ qt

我想读取一个大数据,然后使用Qt将其写入一个新文件.

我试过读一个大文件.大文件只有一行.我用readAll()和测试readLine().

如果数据文件大约是600MB,我的代码可以运行,虽然它很慢.

如果数据文件大约是6GB,我的代码将失败.

你能给我一些建议吗?

更新
我的测试代码如下:

#include <QApplication>
#include <QFile>
#include <QTextStream>
#include <QTime>
#include <QDebug>
#define qcout qDebug()

void testFile07()
{
    QFile inFile("../03_testFile/file/bigdata03.txt");
    if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qcout << inFile.errorString();
        return ;
    }

    QFile outFile("../bigdata-read-02.txt");
    if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;

    QTime time1, time2;
    time1 = QTime::currentTime();
    while(!inFile.atEnd())
    {
        QByteArray arr = inFile.read(3*1024);
        outFile.write(arr);
    }
    time2 = QTime::currentTime();
    qcout << time1.msecsTo(time2);
}

void testFile08()
{
    QFile inFile("../03_testFile/file/bigdata03.txt");
    if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    QFile outFile("../bigdata-readall-02.txt");
    if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;

    QTime time1, time2, time3;
    time1 = QTime::currentTime();

    QByteArray arr = inFile.readAll();
    qcout << arr.size();
    time3 = QTime::currentTime();
    outFile.write(inFile.readAll());

    time2 = QTime::currentTime();
    qcout << time1.msecsTo(time2);

}

int main(int argc, char *argv[])
{
    testFile07();
    testFile08();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

经过我的测试,我分享了我的经验.

  • read()并且readAll()看起来快一样; 实际上,read()更快一点.
  • 真正的区别在于写作.

文件大小为600MB:
使用read功能,读写文件成本约为2.1s,读取时间875ms
使用readAll功能,读写文件成本约10s,读取时间907ms

文件的大小为6GB:
使用read功能,读取和写入有关文件的成本162S,与58S阅读
使用readAll功能,得到错误的答案0 故障运行良好.

Pau*_*ger 7

将这两个文件作为QFiles打开.在一个循环中,字节的固定数量的,说4K,到从输入文件中的一个阵列,然后该阵列到输出文件中.继续,直到你用完字节.

但是,如果您只想逐字复制文件,则可以使用QFile :: copy