Mercurial > hg > orthanc
diff OrthancServer/Sources/ServerJobs/ArchiveJob.cpp @ 5302:ad3cd5ec2074
Reduced the memory usage when downloading archives when "ZipLoaderThreads" > 0
author | Alain Mazy <am@osimis.io> |
---|---|
date | Wed, 24 May 2023 11:44:21 +0200 |
parents | 0ea402b4d901 |
children | b5c502bcaf99 |
line wrap: on
line diff
--- a/OrthancServer/Sources/ServerJobs/ArchiveJob.cpp Mon May 22 17:58:53 2023 +0200 +++ b/OrthancServer/Sources/ServerJobs/ArchiveJob.cpp Wed May 24 11:44:21 2023 +0200 @@ -176,6 +176,7 @@ class ArchiveJob::ThreadedInstanceLoader : public ArchiveJob::InstanceLoader { Semaphore availableInstancesSemaphore_; + Semaphore bufferedInstancesSemaphore_; std::map<std::string, boost::shared_ptr<std::string> > availableInstances_; boost::mutex availableInstancesMutex_; SharedMessageQueue instancesToPreload_; @@ -185,7 +186,8 @@ public: ThreadedInstanceLoader(ServerContext& context, size_t threadCount, bool transcode, DicomTransferSyntax transferSyntax) : InstanceLoader(context, transcode, transferSyntax), - availableInstancesSemaphore_(0) + availableInstancesSemaphore_(0), + bufferedInstancesSemaphore_(3*threadCount) { for (size_t i = 0; i < threadCount; i++) { @@ -227,6 +229,9 @@ { return; } + + // wait for the consumers (zip writer), no need to accumulate instances in memory if loaders are faster than writers + that->bufferedInstancesSemaphore_.Acquire(); try { @@ -270,6 +275,7 @@ { // wait for an instance to be available but this might not be the one we are waiting for ! availableInstancesSemaphore_.Acquire(); + bufferedInstancesSemaphore_.Release(); // unlock the "flow" of loaders boost::shared_ptr<std::string> dicomContent; {