Как заставить NEST НЕ заполнять запрос в ответе Bulk API?

Я искал повсюду и не смог найти подходящий ответ на этот вопрос. Я создал NEST-клиент, используя этот код:

var myIndex = "myTestIndex";
var myType = "myTestType";

var myClusterUri= "http://localhost:9200";
var uri = new Uri(myClusterUri);
var settings = new ConnectionSettings(uri);
var client = new ElasticClient(settings);

а затем позже, используя это, чтобы сделать вызов массового API.

var myJson = PopulateJsonForBulkAPI();
var rawBulkResult = client.Raw.Bulk(myIndex, myType, myJson);

Проблема в том, что я получаю исключение OutOfMemoryException при выполнении массового вызова API. Метод, который заполняет myJson, создает ОГРОМНЫЙ блок JSON, но не достаточно большой, чтобы выдать исключение (но достаточно большой, чтобы вызвать его, если оно было продублировано). Затем, когда я выполняю вызов массового API, он генерирует исключение OutOfMemoryException, потому что NEST удерживает исходный запрос (по сути, дублируя JSON и не имея достаточно памяти для хранения всего). Есть ли способ сделать вызов Bulk API, но сказать NEST, чтобы НЕ удерживать исходный запрос, чтобы огромный блок JSON не дублировался в памяти?

редактировать

Я использую NEST версии 1.7.2 и ElasticSearch версии 1.7.2

1 ответ

Решение

В NEST 1.x байты запроса всегда доступны в ответе, но вы можете написать HttpConnection реализация, которая не делает этого, переопределяя DoSynchronousRequest а также DoAsyncRequest,

Если вы получаете OutOfMemoryException Однако, похоже, что вы пытаетесь отправить слишком много данных в одном массовом запросе. Рассмотрите возможность разделения данных на пакеты массовых запросов.

Другие вопросы по тегам