Exporting org-mode documents using
ox is very slow when there are many
org-id links in the contents.
After some profiling I found the following code is called during export in a loop over each
org-id link which returns the link’s file location.
(car (org-id-find id))
org-id-find will load the file and all of it’s associated modes. This is very slow when all it needs is the file location.
Replacing it with the following makes the code roughly 10x faster.
As a temporary workaround, you can overwrite
(eval-after-load "ox" ;; Org export is very slow when processing org-id links. Override it ;; to skip opening the file and loading all modes. (defun org-export--collect-tree-properties (data info) "Extract tree properties from parse tree. DATA is the parse tree from which information is retrieved. INFO is a list holding export options. Following tree properties are set or updated: `:headline-offset' Offset between true level of headlines and local level. An offset of -1 means a headline of level 2 should be considered as a level 1 headline in the context. `:headline-numbering' Alist of all headlines as key and the associated numbering as value. `:id-alist' Alist of all ID references as key and associated file as value. Return updated plist." ;; Install the parse tree in the communication channel. (setq info (plist-put info :parse-tree data)) ;; Compute `:headline-offset' in order to be able to use ;; `org-export-get-relative-level'. (setq info (plist-put info :headline-offset (- 1 (org-export--get-min-level data info)))) ;; From now on, properties order doesn't matter: get the rest of the ;; tree properties. (org-combine-plists info (list :headline-numbering (org-export--collect-headline-numbering data info) :id-alist (org-element-map data 'link (lambda (l) (and (string= (org-element-property :type l) "id") (let* ((id (org-element-property :path l)) (file (org-id-find-id-file id))) (and file (cons id (file-relative-name file))))))))))