QFtp und ProFTPd -> Server-Kernel bringt out_of_memory
Verfasst: 25. Januar 2010 21:31
Hi Leute!
Ich hab entweder n verständnissproblem oder bin an grenzen von Qt gestossen.
Folgendes:
Ich will aus einer grossen Datei (4GB) am Clienten (mein Qt-Programm) 10 kleine häppchen machen und diese als einzelne Dateien auf den FTP-Server hochladen welcher ein ProFTPd ist. beide Systeme sind Linux und mit jeweils 4GB RAM und ebensoviel Swap gesegnet.
wenn ich nun den code unten laufen lasse, werden die ersten chunks korrekt hochgeladen 2 oder3, bis der Server dann eine kernel "out-of-memory" bekommt und wild prozesse abschiesst.
Interessant ist auch:
Ich habe eine Progressbar im GUI mit dataTransferProgress() verbunden. wie aber immer nur bis 33% läuft und dann der nächste upload startet. Die Datei aber komplett am FTP-Server ankommt. maximum wird bei jedem aufruf neu gesetzt gefolgt von processEvents.
Kann der QFtp nicht mit grossen Dateien umgehen, oder hab ich nen denkfehler im Code?
Ich hab entweder n verständnissproblem oder bin an grenzen von Qt gestossen.
Folgendes:
Ich will aus einer grossen Datei (4GB) am Clienten (mein Qt-Programm) 10 kleine häppchen machen und diese als einzelne Dateien auf den FTP-Server hochladen welcher ein ProFTPd ist. beide Systeme sind Linux und mit jeweils 4GB RAM und ebensoviel Swap gesegnet.
wenn ich nun den code unten laufen lasse, werden die ersten chunks korrekt hochgeladen 2 oder3, bis der Server dann eine kernel "out-of-memory" bekommt und wild prozesse abschiesst.
Interessant ist auch:
Ich habe eine Progressbar im GUI mit dataTransferProgress() verbunden. wie aber immer nur bis 33% läuft und dann der nächste upload startet. Die Datei aber komplett am FTP-Server ankommt. maximum wird bei jedem aufruf neu gesetzt gefolgt von processEvents.
Kann der QFtp nicht mit grossen Dateien umgehen, oder hab ich nen denkfehler im Code?
Code: Alles auswählen
for(int i = 0; i < chunks; i++)
{
//Connect FTP
uploader->connectToHost(ftp_host,ftp_port);
uploader->login(ftp_user,ftp_pass);
uploader->cd(ftp_path);
uploader->cd("tcc-"+taskname);
while(uploader->currentId() != 0)
{
QApplication::processEvents();
}
QApplication::processEvents();
QString chunk_name = QString("%1-%2.chunk").arg(taskname,QString::number(i));
qDebug() << "Writing out Chunk #" << i << " from source to file " << chunk_name;
QByteArray *buffer = new QByteArray();
*buffer = source.read(chunksize);
uploader->put(*buffer,chunk_name);
delete buffer;
//Reset FTP Connection
uploader->close();
}