PC 間で大きなファイル (少なくとも 16 GB) を送受信しようとしています。クライアント アプリケーションが約 2GB を受信すると、アプリケーションがフリーズし、ほとんどすべてのメモリが消費されます (約 2GB のメモリも消費されます)。サーバーサイドではこの問題はありません。
ファイルを送信するサーバーコードは次のとおりです
clock_t startTime = clock();
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));
QString sourceFileName("/path/to/source/sourcefile.big");
QByteArray baFName=sourceFileName.toLocal8Bit();
char* c_fileName=baFName.data();
char buf[BUFSIZ];
size_t size;
unsigned long long sendSize=0;
int source = open64(c_fileName, O_RDONLY, 0);
unsigned long long loopCount=0;
while ((size = read(source, buf, BUFSIZ)) > 0) {
sendSize=clientConnection->write(buf, size);
clientConnection->waitForBytesWritten();
if(sendSize< size) {
qWarning("transmit error!");
}
qDebug() << "Loop #" << ++loopCount << " send data: " << sendSize;
}
qDebug() << double( clock() - startTime ) / (double)CLOCKS_PER_SEC<< " seconds.";
clientConnection->disconnectFromHost();
アプリケーションのクライアント側は、受け取ったファイルの大きさをすでに知っています。ファイルを受け取ってディスクに書き込むコードは次のとおりです。
clock_t startTime = clock();
QString sourceFileName("/path/to/target/targetfile.big");
unsigned long long targetSize=16447314864ULL;
unsigned long long loopCount=(targetSize / 8192ULL) + ( targetSize % 8192ULL > 0 ? 1 : 0);
QByteArray baFName=sourceFileName.toLocal8Bit();
char* c_fileName=baFName.data();
char buf[BUFSIZ];
size_t size;
unsigned long long sendSize=0;
int dest = open64(c_fileName, O_WRONLY | O_CREAT, 0644);
while (loopCount){
if (tcpSocket->waitForReadyRead()){
size=tcpSocket->read(buf, 8192);
write(dest, buf, size);
qDebug() << "Loop #" << loopCount << " receive data: " << size;
loopCount--;
}
}
qDebug() << double( clock() - startTime ) / (double)CLOCKS_PER_SEC<< " seconds.";
問題があれば、ubuntu 14.04を使用しています。