2015-11-18 7 views
0

Я пытаюсь запросить большое количество документов из моей базы данных (которая содержит более 400 тыс. Документов). Я начал использовать встроенное представление _all_docs. Я первый раз пробовал с этим запросом:запрос couchdb никогда не завершается

http://database:port/databasename/_all_docs?limit=100&include_docs=true 

Нет проблем. Завершается, как ожидалось. Теперь, чтобы развернуть его:

http://database:port/databasename/_all_docs?limit=1000&include_docs=true 

Все еще отлично. Взял больше, больше данных и т. Д., Как ожидалось. Рампа снова:

http://database:port/databasename/_all_docs?limit=10000&include_docs=true 

Запрос никогда не завершается. Инструменты Dev в chrome показывают Size = 5.3MB (кажется значительным), и это происходит независимо от того, какое значение для параметра limit, которое я использую, превышает 6500ish. Независимо от того, задаю ли я 6500 или 10000, он всегда возвращает 5,3 МБ, а запрос останавливается.

Я также пробовал другие комбинации, такие как «пропустить», и кажется, что ограничение + пропуск должно быть < 6500, или я получаю тот же ларек.

Моя среда: CouchDB 1.6.1, Ubuntu 14.04.3 LTS, стандарт Azure A1

+0

Какой инструмент вы используете для этого http-звонка? это завиток или просто браузер –

+0

@BrijRajSingh - это было использование Chrome. – Nick

ответ

0

вы должны prewarm ваши запросы, просто бросали 100K или больше докторов и ожидает, что вы получите их из CouchDB не будет работать, это просто не сработает.

Когда вы запрашиваете некоторые элементы из представления (в вашем случае по умолчанию), при первом чтении CouchDB заметит, что B-дерево для представления еще не существует, поэтому оно идет вперед и строит его на первый прочитал. В зависимости от того, сколько документов у вас есть в вашей базе данных, это может занять некоторое время, положив хорошую рабочую нагрузку на вашу базу данных.

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

Есть 2 способа справиться с этой ситуацией 1. Предварительно подогрейте свой вид - запустите cronjob, который читает, чтобы убедиться, что ваш вид имеет B-Tree для этого вида. 2. Прежде чем вставлять данные в couchdb, подготовьте предварительный просмотр для конкретного запроса.

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

+0

Я думаю, что понимаю и соглашаюсь с вашей общей предпосылкой, однако слишком много документов 6500? Должен ли я ожидать ответа на запрос, если это займет время? Возможно, просто написав этот ответ, я думаю, что проверю значение тайм-аута HTTP на сервере CouchDb - возможно, на его тайм-аут, но не на закрытие соединения. – Nick

+0

Это может быть так, но вам действительно нужно возвращать такие большие наборы данных за один раз? 6500 не слишком много, но это также зависит от конфигурации вашего сервера couchdb и размера ваших документов –

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