QDatastream слишком медленный?

Я пытаюсь передать несколько изображений (на самом деле видео) между двумя процессами, используя QSharedmemory. В настоящее время я сериализую QVector QImages и копирую его в память. Это работает, но этапы сериализации занимают около 99% времени. Как я мог сделать это быстрее независимо от платформы?

Мой код для отправки:

int main(int argc, const char* argv[])
{
QObject *parent;

QString program = "python";
QStringList arguments;
QString programPath(PYSOURCE);
arguments << "-u" << programPath+QString("/test.py");
qDebug() << arguments;

QProcess *pyProcess = new QProcess();
pyProcess->start(program, arguments);

QVector<QImage> images;
//.. fill with some images

auto start = std::chrono::system_clock::now();
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);

// this takes extremely long ~44s for 80mb
out << images;

int size = buffer.size();

QSharedMemory sharedMemory("process_example");
if (!sharedMemory.create(size)) {
qDebug() << "Unable to create shared memory segment.";
return 0;
}

qDebug() << "sizeof mem: " << sharedMemory.size() << "bufsize:" << buffer.size();
sharedMemory.lock();char *to = (char*)sharedMemory.data();
const char *from = buffer.data().data();
memcpy(to, from, qMin(sharedMemory.size(), size));

sharedMemory.unlock();

qDebug() << "image copied to shared memory";
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - start);
qDebug() << "duration:" << duration.count() << "ms";

while (pyProcess->waitForReadyRead(-1)){
QByteArray newData = pyProcess->readAllStandardOutput();
QString result = QString::fromLocal8Bit(newData);
qDebug(qPrintable(QString("py:")+result));

}
sharedMemory.detach();

return 0;
}

0

Решение

Я думаю, что основная проблема для вашего буфера заключается в том, что его нужно многократно изменять. Попробуйте установить больший размер подчиненного байтового массива, чем ваши данные.

buffer.buffer ().resize (100000000);

Назовите это непосредственно перед сериализацией изображений.

0

Другие решения

Попробуйте использовать QImage.save чтобы сохранить его в QByteArray как «PNG», а затем скопируйте данные из этого в QSharedMemory с memcpy.

http://doc.qt.io/qt-4.8/qimage.html#save-2

0

По вопросам рекламы [email protected]