Skip to content

Conversation

@suricactus
Copy link
Collaborator

Also added a bit of typingWith the previous implementation of upload_files, the SDK was loading
the whole file to be uploaded in the memory and only then sending it
over the socket. This was painfully slow, memory constrained and lacked
real feedback.

Therefore the requests_toolbelt's MultipartEncoderMonitor is
introduced in this PR, which keeps the memory consumption under control.

This is quite useful not only for CLI consumers of the SDK, but also for
QFieldCloud qgis workers, as the memory does not grow too much when
uploading large files after package or apply_deltas job.

@duke-nyuki
Copy link
Collaborator

@suricactus suricactus force-pushed the QF-6866-multipart_encoder branch from d5a44ee to 1e4cb48 Compare October 20, 2025 22:58
@suricactus suricactus requested a review from lukasgraf October 20, 2025 23:00
Copy link

@lukasgraf lukasgraf left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! 👍 🎉

I also took this opportunity to familiarize myself a bit more with qfieldcloud-sdk-python, and checked out your branch and tested it locally.

Works like a charm, as far as I can tell. The progress bar now moves a lot more naturally, for large uploads, compared to before.

Though it's still not perfectly in sync: After uploading a 9GB file, the progress bar finishes and the output gets stuck at Uploading "9GB.dat"...: 9.66GB [02:09, 74.5MB/s] for quite a while. But I'm pretty sure that is unavoidable because during that time

  • the file is streamed from nginx's buffer to Django
  • processed by Django
  • committed to storage
  • and only then will Django answer with a response + status code.

So I think for huge files like that there is always going to be some delay on the "last mile".

With the previous implementation of `upload_files`, the SDK was loading
the whole file to be uploaded in the memory and only then sending it
over the socket. This was painfully slow, memory constrained and lacked
real feedback.

Therefore the `requests_toolbelt`'s `MultipartEncoderMonitor` is
introduced in this PR, which keeps the memory consumption under control.

This is quite useful not only for CLI consumers of the SDK, but also for
QFieldCloud `qgis` workers, as the memory does not grow too much when
uploading large files after `package` or `apply_deltas` job.
@suricactus suricactus force-pushed the QF-6866-multipart_encoder branch from 1e4cb48 to c8f94f1 Compare October 22, 2025 08:25
@suricactus suricactus merged commit 3647622 into master Oct 22, 2025
8 checks passed
@suricactus suricactus deleted the QF-6866-multipart_encoder branch October 22, 2025 08:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants