1

我一直在寻找所有地方,但无法找到这个问题的合适答案。我使用以下代码创建了一个 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);

我遇到的问题是在进行批量 api 调用时出现 OutOfMemoryException。填充 myJson 的方法创建了一个巨大的 JSON 块,但不足以引发异常(但如果它被复制,则足以引发异常)。然后,当我调用批量 api 时,它会抛出 OutOfMemoryException,因为 NEST 保留原始请求(本质上,复制 JSON 并且没有足够的内存来保留所有内容)。有没有办法调用 Bulk API,但告诉 NEST 不要保留原始请求,这样大块 JSON 就不会在内存中重复?

编辑

我正在使用 NEST 1.7.2 版和 ElasticSearch 1.7.2 版

4

1 回答 1

1

在 NEST 1.x 中,请求字节始终在响应中可用,但您可以编写一个HttpConnection不这样做的实现,覆盖DoSynchronousRequestDoAsyncRequest.

如果您收到OutOfMemoryExceptions,这听起来像是您试图在一个批量请求中发送太多数据。考虑将数据拆分成批量请求。

于 2016-06-20T01:50:09.327 回答