【发布时间】: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