How does Orthanc scale?


     We currently have one 0.7.2 Orthanc server receiving images from an xray scanner for the past six months without issue. So now we are investigating using a central Orthanc server to collect the images from ten different sites, all with two to three imaging services at each site. The imaging services will include CT scans and ultra sound, each of which generate more data than your typical xray.

     What load are people currently using their Orthanc server under? If we are looking at pushing 3,000 images a month at it simultaneously from different sites is it going to be able to handle it okay? Does Orthanc have any hard limitations, or is it only limited by the hardware it runs on?



Glad to learn that Orthanc is useful to your medical practice!

There is no hard limitation in the Orthanc source code. The existing limitations are rather a consequence of the trade-off implied by its embedded database engine: Orthanc has chosen SQLite in order to make its installation trivial (everything is stored as plain files), but SQLite is not designed to manage very large amount of data (contrarily to MySQL/PostgreSQL/…).

If you plan to make images online in the long-term directly from Orthanc, the open-source edition of Orthanc might therefore not fit your needs.

However, if Orthanc is used as a temporary buffer (e.g. as an auto-routing gateway, as an endpoint to archive DICOM instances into a NAS, or for transient quality control), i.e. if the medical images do not permanently stay online, you should not encounter any problem, even with 3000 series per month. To put this into perspective, I currently use an Orthanc buffer to make online a set of 200 PET-CT studies (each of them consisting of about 300 instances of about 250MB), using a sliding window approach (the newest studies replace the oldest ones). It runs perfectly fine.

You might also use multiple separate instances of Orthanc, e.g. one for each of your remote sites, in order to implement load balancing if you experience performance issues.


Hi Sébastien,

This is exactly my use case, except that I would like to have a sliding window in which the studies have a lifetime of a certain number of days/weeks (thus no limit on the number of studies). Do you have any example code (e.g. from your own use case) or tips for me on how to set this up?

Cheers and thanks, I really like Orthanc,

Hi Marcel,

Glad to hear that Orthanc is useful to you!

For your question, you could take the following Python script as a starting point:

Instead of testing “infos[‘MainDicomTags’][‘PatientName’]”, you could check that the value of “infos[‘LastUpdate’]” is below your trigger date (written using ISO 8601). This will allow you to select all the patients that were received too long ago.

Then, instead of anonymizing the matching patients, you could remove them with a call to “RestToolbox.DoDelete(‘%s/patients/%s’ % (URL, patient))”.

Finally, you could run this script on a daily/weekly basis (for instance using cron).