0

ファイルからバイナリ データを処理するプログラムがあります。

コードの概要は次のとおりです。

QFile fileIn ("the_file");
fileIn.open(QIODevice::ReadOnly);

このファイルには、バイナリ データとテキスト データが混在しています。ファイルの内容は QDataStream を使用して読み取られます。

QDataStream stream(&fileIn);
stream.setByteOrder(QDataStream::LittleEndian);
stream.setVersion(QDataStream::Qt_5_0);

QDataStream からのデータをさまざまなデータ型に読み取ることができます。例えば

QString the_value;  // String
stream >> the_value;
qint32 the_num;
stream >> the_numm;

素敵で簡単。全体として、0x68 0x48 などの区切り記号を表す特定の値に到達するまで、ファイル データをバイト単位で読み取ります。この時点で、次のデータの種類 (floats、String、int など) を示す次の数バイトを取得し、必要に応じて抽出します。

したがって、データは次のように処理 (アウトライン) されます。

while ( ! stream.atEnd() )
{
    qint8 byte1 = getInt8(stream);
    qint8 byte2 = getInt8(stream);
    if ( byte1 == 0x68 && byte2 == 0x48 )   
    {
        qint8 byte3 = getInt8(stream);
        qint8 byte4 = getInt8(stream);
        if ( byte3 == 0x1 && byte4 == 0x7 )
        {
            do_this(stream);
        } 
        else if ( byte3 == 0x2 && byte4 == 0x8 )
        {
            do_that(stream);
        }
    }
}

この埋め込みデータの一部は圧縮されている可能性があるため、

long dSize = 1024;
QByteArray dS = qUncompress( stream.device()->read(dSize));

QBuffer buffer;
buffer.setData(dS);

if (!buffer.open(QBuffer::ReadOnly)) {
    qFatal("Buffer could not be opened. Something is very wrong!");
}

QDataStream stream2(&buffer);
stream2.setByteOrder(QDataStream::LittleEndian);
stream2.setVersion(QDataStream::Qt_5_0);

QDataStream の便利さにより、特定の型へのマッピングだけでなく、エンディアンの処理も簡単になるという点で、データの読み取りが容易になりますが、速度が犠牲になっているようです。この問題は、処理が再帰的であるという事実によって悪化します。読み取られるデータ自体に、同じ方法で読み取って処理する必要がある埋め込みファイル データが含まれる可能性があります。

より高速な代替手段はありますか?その場合、エンディアンを同じ方法で処理するにはどうすればよいですか?

4

1 に答える 1

1

あなたのコードは簡単に見えます..再帰はショーストッパーであってはなりません...

弦がたくさんありますか?数千?

stream >> string new本当に遅いものを使用してメモリを割り当てます。その後、手動で解放する必要があります。operator>>(char *&s)メソッドについては、Qt Docs を参照してください。これは、QStrings に読み込むときに使用されます。

readBytes(char *&s, uint &l)同じことが内部的に呼び出されてすべてが遅くなる可能性がある場合にも当てはまります!

QString 自体もメモリを割り当て (16 ビット エンコーディングを使用する場合の 2 倍)、さらに遅くなります。

これらの関数のいずれかを頻繁に使用する場合は、readRawData(char *s, int len)さらに処理する前に、事前に割り当てられたバッファーを使用して直接読み取るようにそのコード部分を書き直すことを検討してください。

全体として、高性能が必要な場合は、QDataStreamそれ自体がショーストッパーになる可能性があります.

于 2016-04-14T06:10:22.373 に答える