2016-01-20 14 views
0

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

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

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

Это не делает значительную разницу в моих тестах. Я подозреваю, что сериализация acutal неэффективна, и простой memcpy будет достаточно, но Im не уверен, как обрабатывать заголовки изображений и т. Д. – MaxR

0

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

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

+0

К сожалению, сжатие png слишком медленное для моего приложения (примерно так же медленное, как кодирование потока данных). Теперь я записываю необработанные байты в память, что работает, но использует примерно в 30 раз больше пространства, чем сжатые данные – MaxR