Best Practices
Advisory guidance for running real submissions at scale.
Do a staging run first
Run a complete test submission against the staging environment before you run anything against production. This is the single recommendation worth acting on before you touch a real dataset, which is why it sits at the front of this page.
A staging run is a full rehearsal — the same A–J steps, the same credentials mechanics, the same encrypt-and-upload — against an environment where a mistake costs nothing. It is the cheapest way to surface a missing mappers.xlsx row, a wrong Image path, or a storage-ownership problem before it reaches the real archive.
The A–J path is written for staging by default: the credentials you download come from staging-login.bp.nbis.se, and J. Upload to BigPicture sends the bundle to the staging inbox. Use a small, representative batch — a handful of slides is enough to exercise every step — rather than the full dataset.
Only once a staging dataset has passed validation and uploaded cleanly should you switch. The wiring that has to change, and what stays separate afterwards (production credentials live in their own directory, so a staging run can never upload to the archive), is the checklist in Prepare for production.
Large datasets
A real submission can be terabytes of whole-slide images (WSI). Most time will be spent Dicomizing and uploading your slides. Everything else (metadata parsing, curation, export) is cheap by comparison.
Budget your disk
The two big data locations live on separate budgets, so plan them separately:
PIPELINE_IMAGE_ROOTholds your source dataset. The pipeline reads it in place and never copies it elsewhere, so this only needs to fit the raw WSI.PIPELINE_STORAGEholds the converted output — the export outbox (storage/storage) — plus some transient conversion working space. Plan for it to hold roughly 1× the converted dataset. The converted DICOM is in the same ballpark as the source, so a safe rule of thumb is “as much free space inPIPELINE_STORAGEas your raw WSI occupies”.
You do not need a third copy for the upload: the BigPicture submitter encrypts and streams the export straight from the outbox to BigPicture, without writing another copy to disk.
Running out of space mid-conversion leaves a batch half-processed, but completed images are kept. Free up space, then enable restore_projects (see Performance tuning) so the run resumes the remaining images instead of starting the batch over.
Split a large set into multiple batches
If you do not want to process the entire dataset in a single batch, Slidetap can batch for you. Inside a project, create several batches and process them one at a time:
- Curation and recovery stay manageable. Invalid items and failed images are scoped to one batch, so a problem in batch 3 does not block batches 1 and 2.
- The conversion working set stays bounded. Only the batch in flight is being converted at any time, so the intermediate conversion space never has to hold the whole dataset at once. Note this does not shrink the final footprint: the export outbox is per project, not per batch — every batch exports into the same project directory, and
make uploadsends that whole directory in one go. PlanPIPELINE_STORAGEfor the full project’s converted output regardless of how many batches you split it into. - Progress is checkpointed. A completed batch is sealed; an interruption only costs you the batch in flight.
Performance tuning
Most tuning lives in config.yaml (see D. Configure). The knobs below are ordered from the ones with the biggest, safest impact to more specialised ones. Change one at a time and re-time a small batch so you can attribute the difference.
There are two independent forms of parallelism, and they stack:
dicomization.threads— how fast a single slide converts (parallel tiles within one image).task.concurrency— how many slides convert at once (parallel jobs across images).
All of these live in config.yaml. A setting written as section.key (e.g. dicomization.threads) is the key threads under a top-level dicomization: section. The shipped config.yaml.example does not ship the task: or image_cache: sections as active settings (at most as commented-out placeholders), so to tune those add the section to your config.yaml yourself:
task:
concurrency: 8
image_cache:
cache_size: 20| Setting | Default | Effect & when to change |
|---|---|---|
dicomization.threads |
1 |
Parallelises tile conversion within a single slide. Raise on multi-core hosts to speed conversion. Effectiveness depends on the slide format/backend, so measure on a sample of your own data |
task.concurrency |
4 |
Number of image jobs a worker runs in parallel — how many slides convert at once. Higher converts more simultaneously, at the cost of CPU, memory, and storage I/O contention. Tune against your host’s cores and the throughput of PIPELINE_STORAGE. Can also be set without editing config.yaml via the PROCRASTINATE_WORKER_CONCURRENCY environment variable |
dicomization.levels |
all |
Restricting to a subset (e.g. [0, 1, 2]) produces smaller output and converts faster, but reduces the zoom range in viewers. Good for quick tests; think carefully before restricting a real submission |
image_cache.cache_size |
10 |
Number of images held in the in-memory cache. Larger can reduce re-reads at the cost of memory |
restore_projects |
false |
Resume in-progress projects after a container restart. Worth enabling for long large-dataset runs that may be interrupted |
dicomization.include_labels |
false |
Includes the barcode/cassette label image. Small size impact; mainly a correctness/privacy choice |
dicomization.include_overviews |
false |
Includes the macro overview thumbnail. Small size impact; mainly a correctness/privacy choice |
Finding the right task.concurrency
There is no universal best value — it depends on your host’s cores and how fast PIPELINE_STORAGE is. Find it empirically:
- Start around your CPU core count.
- Convert a small, representative batch and note the wall-clock time.
- Raise
task.concurrencyand re-run the same batch. Keep going while the time keeps dropping. - Stop when it stops improving — or when CPU, memory, or disk I/O saturates (slides start waiting on storage rather than CPU). Back off one step from there.
Change only this one knob between runs so you can attribute the difference, and keep an eye on memory: too many parallel conversions can exhaust RAM.
For a quick smoke of a large set, restrict dicomization.levels to a few upper levels and raise dicomization.threads — you get a usable pyramid in a fraction of the time, then drop back to all levels for the real submission.
This page is meant to grow. If you discover a setting or technique that meaningfully changes throughput or capacity, add a row to the table above (or a short subsection) so the next operator benefits.
Where to get help
If a large run misbehaves and the guidance here does not resolve it, see Support for who to contact and what to include.