Skip to content

Optimizing Cache Performance

While we believe this post may be helpful to advanced users, we have not yet reviewed it thoroughly. If you have suggestions for improvement, please let us know by clicking to send a pull request.

For advanced users only. This guide is maintained by the community and may contain inaccurate or incomplete advice. You can contribute by clicking to send a pull request with your changes.

Some users might want to place the thumbnail cache on a separate, faster file system while keeping the actual photo files on large, slow bulk storage. This should result in faster access to the thumbnails.

To do this, we add a further volume (-v) parameter to the docker script so we use an external path (outside the container) for the cache files. You can get the internal path with photoprism config, or as a docker command in a running system (for Linux/BSD systems):

sudo docker exec photoprism photoprism config | grep cache-path

This should return a line such as:

cache-path            /home/photoprism/.cache/photoprism

for the internal path. We now know to add a line like

  -v <MYCACHE_FOLDER>:/home/photoprism/.cache/photoprism \

to the docker invocation, with your actual path to the cache folder replacing <MYCACHE_FOLDER>.

As an example, let's assume a ZFS filesystem with two pools ("volumes" in classical terminology): A pool tank in a raidz2 (RAID6) configuration based on hard drives that holds the original pictures, and a pool dozer in a mirrored (RAID1) configuration based on SSD or NVMe drives to store the thumbnails. Our docker script could be:

docker run -d \
  --name photoprism \
  -p 2342:2342 \
  -v /tank/photos/:/home/photoprism/Pictures/Originals \
  -v /dozer/cache/:/home/photoprism/.cache/photoprism \
  photoprism/photoprism:latest

In a case like this, you will probably also want to optimize the datasets ("file systems") tank/photos and dozer/cache further. For instance, the original photo files will call for a larger recordsize than the smaller cache files.