Идиоматические библиотеки clojure (такие как clojure.java.jdbc) будут предоставлять эти длинные списки в виде отложенных последовательностей. Это означает, что вам просто нужно достаточно памяти, чтобы содержать одну строку плюс обычные накладные расходы на загрузку clojure и библиотек - при условии, что вы получаете данные из файла или базы данных и записываете их в поток / db / что угодно, а не сохраняете их все в память.
Что касается запрашиваемого преобразования, учитывая последовательность строк (отображений), называемых набором результатов, что-то вроде:
(interpose "\n"
(map (fn [row]
(clojure.string/join "|" (map row [:consumer :product ...]))
result-set)))
Даст вам ленивый seq, который вы можете просто скопировать в файл, чтобы получить что-то вроде | отдельные данные, которые вы хотите.
Приложение: что касается «быстрого» - если ваши настройки хранилища не являются необычными, это, вероятно, будет значительно быстрее, чем ваш ввод / вывод хранилища - и это прямо вперед.