2015-06-10 2 views
1

ОБНОВЛЕНИЕ: см. MarkLogic 8 - Stream large result set to a file - JavaScript - Node.js Client API для ответа на вопрос о том, как это сделать в Javascript. В этом вопросе конкретно спрашивают о XQuery.MarkLogic 8 - XQuery написать большой результирующий набор в файл эффективно

У меня есть веб-приложение, которое использует службы отдыха, размещенные в node.js.

Узел просто проксирует запрос XQuery, который затем запрашивает MarkLogic. Эти запросы уже имеют настройку поискового вызова и работают нормально в обычном случае, чтобы вернуть страницу данных в пользовательский интерфейс.

Мне нужно иметь функцию экспорта, так что, когда я добавляю URL-адрес export=all по запросу, он больше не ищет страницу.

В этот момент он должен получить весь набор результатов, даже если это миллион записей, и сохранить его в файле.

Фактический запрос должен немедленно вернуться: «Мы сообщим вам, когда ваша загрузка будет готова».

Одно из предложений заключалось в использовании xdmp:spawn для вызова XQuery в фоновом режиме, который сохранил результаты в файле. Мой фактический HTTP-запрос мог бы немедленно вернуться.

Для части икры я думаю, что идея заключается в том, что я запускаю свой запрос с различными параметрами, чтобы получить все результаты вместо одной страницы. Затем я прокрутил данные и создаю строковую переменную, чтобы вызвать xdmp: save with.

Некоторые вопросы, это хорошая идея? Есть ли способ лучше? Если я прохожу через набор результатов, и он очень большой (гигабайт), это может вызвать проблемы с памятью.

Невозможно напрямую передать результаты в файл в XQuery?

Примечание: Еще одна идея у меня было перехватить запрос на (узел) слой прокси, а затем сделать xdmp: оценить, чтобы получить количество записей, а затем петлю через запрашивая каждую страницу и промывке его на диск. В этом случае я должен был бы найти способ, чтобы вернуть мою просьбу еще сразу процесс в фоновом режиме в узле, который, кажется, есть некоторые идеи здесь: http://www.pubnub.com/blog/node-background-jobs-async-processing-for-async-language/

ответ

1

Одна из возможных стратегий было бы использовать самостоятельно порождая задачу, , на каждой итерации получает следующую страницу результатов для запроса.

Вместо сохранения результатов непосредственно в файл, однако, вы можете рассмотреть вопрос об использовании xdmp: HTTP-пост() для отправки каждой страницы на сервере:

http://docs.marklogic.com/xdmp:http-post?q=xdmp:http-post&v=8.0&api=true

В частности, сервером может быть сервер Node.js, который добавляет каждую страницу по мере поступления в файл или любой другой набор данных.

Таким образом, Node.js может обрабатывать длительное асинхронное IO с минимальной нагрузкой на сервер базы данных.

Когда задача с саморазрушением попадает в конец запроса, она снова может использовать HTTP-запрос для уведомления Node.js о закрытии файла и сообщает, что экспорт завершен.

Hping, который помогает,

+0

Я думаю, что это в основном то, что я сказал в примечании на дне? –

+0

Возможно, я неправильно понял. Я думал, что примечание в конце вопроса предполагает вытащить из MarkLogic в Node.js (что также будет работать); ответ выше предполагает отталкивание от MarkLogic в Node.js. – ehennum

Смежные вопросы