elasticsearch,Python,elasticsearch" /> elasticsearch,Python,elasticsearch" />

使用Python API在Elasticsearch中滚动时出现分段错误

使用Python API在Elasticsearch中滚动时出现分段错误,python,elasticsearch,Python,elasticsearch,我正在使用Elasticsearch Python API根据存储在ES集群中的数据计算一些东西。对于我的计算,我需要调用所有满足特定条件的文档,并从中获取特定信息。因此,我正在做一个大小为1000、持续时间为1秒的卷轴。我已经编写了一个Python脚本,它使用ES Python为我完成这项工作 但是,每次滚动超过1400次后,脚本都会退出,并出现错误“分段错误(内核转储)”。我曾尝试将卷轴大小改为10000,但仍然出现相同的问题。以下是脚本中我正在进行滚动的部分: page = Elastic

我正在使用Elasticsearch Python API根据存储在ES集群中的数据计算一些东西。对于我的计算,我需要调用所有满足特定条件的文档,并从中获取特定信息。因此,我正在做一个大小为1000、持续时间为1秒的卷轴。我已经编写了一个Python脚本,它使用ES Python为我完成这项工作

但是,每次滚动超过1400次后,脚本都会退出,并出现错误“
分段错误(内核转储)
”。我曾尝试将卷轴大小改为10000,但仍然出现相同的问题。以下是脚本中我正在进行滚动的部分:

page = Elasticsearch().search(index = my_index, scroll = "1s", size = 1000, body = { "_source" : [ "_id", "@timestamp", my_field], "query" : {"bool":{"must" : [{"exists":{ "field" : my_field }},{"exists":{ "field" : "@timestamp" }}]}}})
sid = page['_scroll_id']
scroll_size = page['hits']['total']
while (scroll_size > 0):
    print "Scrolling..."
    # Get the number of results that we returned in the last scroll
    scroll_size = len(page['hits']['hits'])
    print "scroll size: " + str(scroll_size)
    page = Elasticsearch().scroll(scroll_id = sid, scroll = '1s')
    # Update the scroll ID
    sid = page['_scroll_id']
我可以找到导致错误的行
page=Elasticsearch().scroll(scroll\u id=sid,scroll='1s')
。我已经检查了滚动id,它总是一样的(至少在抛出错误之前是一样的)。 有没有人遇到过类似的问题,或者有人知道如何解决这个问题

我使用OS Ubuntu 14.04在同一台服务器上运行Python和Elasticsearch。Python版本是2.7.6,ES版本是5.0.0(将此作为答案发布,因为代码格式在注释中不起作用)

试着这样做:

import elasticsearch
import elasticsearch.helpers

scanner = elasticsearch.helpers.scan(client=elasticsearch.Elasticsearch), index=my_index, query={...}, scroll='1s')
for doc in scanner:
    #Do something
(将此作为答案发布,因为代码格式在注释中不起作用)

试着这样做:

import elasticsearch
import elasticsearch.helpers

scanner = elasticsearch.helpers.scan(client=elasticsearch.Elasticsearch), index=my_index, query={...}, scroll='1s')
for doc in scanner:
    #Do something

最后我发现这与在ES中滚动无关,但这是一个内存问题。在循环中,我将来自ES的输出保存到数组中,这些数组在每次迭代中都被扩展。所以在某个时候,内存限制达到了。

最后我发现这与在ES中滚动无关,但这是内存问题。在循环中,我将来自ES的输出保存到数组中,这些数组在每次迭代中都被扩展。因此,在某个时候达到了内存限制。

您是否考虑过改用扫描辅助程序?我以前不知道这件事。是否有使用扫描助手的工作示例?我一直在尝试它,但不知道它是如何工作的。你考虑过使用扫描助手吗?我以前不知道这件事。是否有使用扫描助手的工作示例?我一直在尝试它,但不知道它是如何工作的。谢谢你的提示!最后,它与扫描API无关,而是与我在循环中所做的操作有关,因为我将从ES检索的数据保存在数组中,这些数组随每次迭代而扩展,因此在某个时候内存耗尽感谢提示!最后,它与扫描API无关,而是与我在循环中执行的操作有关,因为我将从ES检索到的数据保存在数组中,数组随每次迭代而扩展,因此在某个时候内存耗尽