With 12MB of text, that's got to be a huge number of date entry headings, so I would imagine buffer narrowing might still be a good way to go.
I'm an org-mode novice, so I may be missing an easier way to achieve this, but the following will automatically narrow the buffer to the entries made since three months prior to the current date.
(defvar my-org-journal "/path/to/file.org")
(add-hook 'org-mode-hook 'my-org-mode-hook)
(defun my-org-mode-hook ()
(when (equal (expand-file-name (buffer-file-name))
(expand-file-name my-org-journal))
(my-org-narrow-to-month-of-entries)))
(defun my-org-narrow-to-month-of-entries ()
"Narrow buffer to entries within the last three months."
(interactive)
(let ((minimum-date
(with-temp-buffer
(progn
(org-insert-time-stamp (current-time) nil t)
(org-timestamp-change -3 'month)
(buffer-substring-no-properties
(point-min) (point-max))))))
(save-excursion
(while (search-forward-regexp org-tsr-regexp-both nil t)
(let ((end (point)))
(backward-sexp)
(let ((datestamp (buffer-substring-no-properties (point) end)))
(if (string< datestamp minimum-date)
(narrow-to-region (point-min) (point))
(forward-sexp))))))))
And, of course, C-xnw to widen the buffer again to see all the entries.
If you wanted to apply this based on a Local Variable rather than by file name, you could use this approach instead:
(defvar my-org-narrow-to-month-of-entries nil)
(add-hook 'org-mode-hook 'my-org-mode-hook)
(defun my-org-mode-hook ()
(add-hook 'hack-local-variables-hook
(lambda () (when my-org-narrow-to-month-of-entries
(my-org-narrow-to-month-of-entries)))
nil t))
with the following at the end of your file:
;;; Local Variables:
;;; my-org-narrow-to-month-of-entries: t
;;; End:
References:
edit:
I'm not sure if that will do anything about that long load time, to be honest. A sample org file of comparable size doesn't take remotely that long to load on my machine, but I don't know whether that's due to better hardware, or my simple dummy file being easier to process.
If the above doesn't improve things, we could look at making the narrowing happen before org-mode is initialised, and see if that makes any difference?
The following may not be the best way of doing this, but it should be worth trying out for performance reasons, just in case it makes a difference.
This would be in place of the org-mode-hook, and using the my-org-journal
variable for the filename, as with the first example above.
(defadvice insert-file-contents (after my-insert-file-contents)
(when (equal (expand-file-name (buffer-file-name))
(expand-file-name my-org-journal))
(require 'org)
(my-org-narrow-to-month-of-entries)))
(ad-activate 'insert-file-contents)
C-c / m
for match search, and something likeMatch: TIMESTAMP>"<-3m>"
as the search expression. But in my tests, this will only match entries containing a TODO keyword. Having solved this last issue, the search can be assigned to a key binding, or a hook, so that you don't need to type it each time. – Matthiew