【问题标题】:Python: Query to InfluxDB slows down after a couple of sequential callsPython:在几次连续调用后,对 InfluxDB 的查询速度变慢
【发布时间】:2019-07-16 14:48:00
【问题描述】:

我在 8 GB RAM 的 Macbook 上的 docker 容器中运行 Influx-DB 实例(所以我有点受限制)。我正在编写一个对数据库执行查询的 Python 程序。由于获取大块数据因超时而失败,我正在执行顺序调用,在其中获取属于一小时数据采集的数据。这是我顺序调用数据库的代码:

for day in range(15,25,1):
        for hour in range(0,24, 1):
            lowerDate = '2019-03-' + f'{day:02}'
            lowerHour = f'{hour:02}' + ':00:00'
            upperDate = lowerDate
            upperHour = f'{hour:02}' + ':59:59'
            rawDataSet: pd.DataFrame = influxDataReader.getRawDataByAcqTimeFrame(lowerDate=lowerDate,
                                                                           lowerTime=lowerHour,
                                                                           upperDate=upperDate,
                                                                           upperTime=upperHour)

            if rawDataSet is not None and rawDataSet.size > 0:
                resultRawData = resultRawData.append(rawDataSet)
                print('Got data for ' + lowerDate + 'T' + lowerHour + '. resultRawData.size = ' +
                      str(resultRawData.size))
            else:
                print('No data: ' + lowerDate + 'T' + lowerHour + '.')

            time.sleep(1.0)

方法getRawDatabyTimeFrame:

def getRawDataByAcqTimeFrame(self, lowerDate: str, lowerTime: str, upperDate: str, upperTime: str):
    queryStatement = """SELECT rawdata,
     sequenceStartStamp, 
     timestampCycle
     from YRT1DT1F_rawdata 
     WHERE time >= '""" + \
                     lowerDate + 'T' + lowerTime + '.0Z' + """' AND time <= '""" + \
                     upperDate + 'T' + upperTime + '.0Z' + """'"""

    result: pd.DataFrame = pd.DataFrame(self._influxConnector.executeQueryStatement(queryStatement).get_points())
        if dropDuplicateRows:
            result = result.drop_duplicates()
        return result

最后是“executeQuery()”方法:

def executeQuery(self, selectStatement: str, chunked: bool = False, chunksize: int = 10000) -> influxdb.resultset.ResultSet:
    if self._influxClient is None:
        print('Initializing DB...')
        self.initDbClient()

    try:
        queryResult: influxdb.resultset.ResultSet = self._influxClient.query(selectStatement,
                                                                             chunked=chunked,
                                                                             chunk_size=chunksize)
    except Exception as err:
        print('Error while executing DB statement: ' + selectStatement + '. Error message: ' + str(err))
    finally:
        self._influxClient.close()

    try:
        queryResult
    except Exception as err:
        print('queryResult was not assigned.')
        raise err
    else:
        return queryResult

此代码按预期返回前三个调用 (2019-03-15T00:00:00.0Z - 2019-03-15T02:59:59.0Z) 的数据。 2019-03-15T03:00:00 和 2019-03-22T23:59:59 之间的数据库中没有可用数据,因此代码返回一个空的 rawDataSet 并发出消息“无数据:...”正如预期的那样。

问题是这段代码的执行速度预计会快到 2019-03-17T23:00:00(返回空 rawDataSet 的调用每隔 ~ 秒执行一次)。然后,从 2019-03-18T:00:00:00 开始,执行速度急剧下降:每个“空”调用突然需要 30 秒甚至一分钟。

这可能是什么原因?

【问题讨论】:

  • 我猜我们没有人可以神奇地为您的开发环境添加资源。我倾向于做的是基于安装了 docker 的模板启动一个云实例并在那里运行这些东西(在你的情况下是一个 influxdb)。与ssh tunnels结合使用,一分钱一分货,省去不少麻烦。

标签: python performance influxdb


【解决方案1】:

在 CLI 模式下运行此查询需要多长时间?

【讨论】:

    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 2018-10-25
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多