2014-07-29 6 views
0

Я хочу рассчитать MD5 хэш файла.QT - QFile - медленное чтение из файла

Если я использую fast_md5 с родным lib http://twmacinta.com/myjava/fast_md5.php, тогда Java читает файл с жесткого диска с 90 Мбайт/с ... 120 Мбайт/с и время вычисления 70 секунд.

Если я использую QT

QCryptographicHash hash(QCryptographicHash::Md5); 

    QFile in("C:/file.mkv"); 

    QFileInfo fileInfo("C:/file.mkv"); 
    qint64 imageSize = fileInfo.size(); 

    const int bufferSize = 1000000; 

    char buf[bufferSize+5]; 
    int bytesRead; 

    if (in.open(QIODevice::ReadOnly)) { 

     while ((bytesRead = in.read(buf, bufferSize)) > 0) { 
//   imageSize -= bytesRead; 
//   hash.addData(buf, bytesRead); 

     } 

    } 
    else { 
     qDebug() << "Failed to open device!"; 
    } 

    in.close(); 
    qDebug() << hash.result().toHex(); 

тогда моя программа чтения файла с жесткого диска со скоростью 20 ... 78 Мб/с и известково время составляет 210 секунд.

Можно ли ускорить обработку MD5 Calc в QT? Может понадобиться увеличить буфер от 1000000 до большего значения?

+0

экспериментировали Вы с увеличением размера буфера? – RobbieE

+0

Буфер настолько велик, что он должен быть выделен в куче, и он должен быть кратным a из 4096 байт - малым размером страницы. Нет смысла добавлять 5 дополнительных байтов в конце. Чтобы провести значимое сравнение, вам нужно прочитать первую половину файла, используя 'fread' и' fwrite', а вторую половину - 'QFile'. Независимо от того, какие различия вы увидите, это будет косвенным и не будет равносильно ничему, если вы правильно проведете тестирование. Вам действительно нужно опубликовать полный тест, который использует QElapsedTimer для самого времени. –

ответ

0

Лучшее решение

/*max bytes to read at once*/ 
static const qint64 CHUNK_SIZE = 1024; 

/*init hash*/ 
QCryptographicHash hash(Sha1); 

/*open file*/ 
QFile file("foo.bar"); 
if (!file.open(QIODevice::ReadOnly)) 
    return; 

/*process file contents*/ 
QByteArray temp = file.read(CHUNK_SIZE); 
while(!temp.isEmpty()) 
{ 
    hash.addData(temp); 
    temp = file.read(CHUNK_SIZE); 
} 

/*finalize*/ 
const QByteArray res = hash.result(); 
qDebug("Hash is: %s", res.toHex()); 

Это решение обеспечивает мне наилучшую скорость чтения (около 100-120 МБ/с) и лучшее время известково - 51 ... 75 сек.

От https://qt-project.org/forums/viewthread/41886

Смежные вопросы