当前位置: 首页 > news >正文

网站改名字 收录为什么做网站ppt

网站改名字 收录,为什么做网站ppt,html5网站开发前景,西安做网站-西安网站建设-西安网站制作-西安网络公司_千秋网络1.问题背景描述 python项目中的时序数据都存放在TD数据库中,数据是秒级存入的,当查询一周数据时将超过50w数据量,这是一次性获取全量数据到python程序很慢,全流程10秒以上,希望进行优化加速 2.排查 首先&#xff0c…

1.问题背景描述

python项目中的时序数据都存放在TD数据库中,数据是秒级存入的,当查询一周数据时将超过50w数据量,这是一次性获取全量数据到python程序很慢,全流程10秒以上,希望进行优化加速

2.排查

首先,分步排查从td取超过7秒,在python程序中处理格式超过3秒;
其次,业务逻辑处理步骤中,时间大量消耗的逻辑是 时间对象转成字符串;
再次,td取数步骤中,时间大量消耗的逻辑是 获取到数据后时间戳转为时间对象
最后,思路确定为,从td获取的ts字段直接按bigint返回,交由业务逻辑处理,直接从bigint转成字符串;

3.查源码尝试修改

TD取的ts字段是用bigint存的(C_TIMESTAMP类型),排查源码发现公共包中会将C_TIMESTAMP类型的字段都转成datetime对象返回,而转化方法_convert_millisecond_to_datetime就是慢的根源;继续查相关源码,若想用bigint返回,发现CONVERT_FUNC_BLOCK这个函数工厂,key是每个字段类型fields[i][“type”],这个字段类型是在taos_fetch_fields

# TDHelper().db_query(sql) 调用入口
class TDHelper:  # 自定义的TD适配逻辑def db_query(self, sql, return_timestamp=False):with self.cursor() as c:return self._query_handler(c, sql, return_timestamp)def _query_handler(self, cursor, sql, return_timestamp=False):try:cursor.execute(sql)  # execute中会获取_fields属性,由决定后续字段序列化的逻辑# cursor._fields[0]._type = 5  # 修改,测试用result = cursor.fetchall()if not return_timestamp:return resultelse:ret_result = []for one in result:ret_result.append((one[0].timestamp(), *one[1:]))return ret_resultexcept ProgrammingError as e:if e.msg == 'Fail to get table info, error: Table does not exist':# 只输出sql,不需要输出异常信息logger.warning('Table does not exist, sql [{}]'.format(sql))return []raise e# 如下都是TD公共包中的源码def fetchall(self):  # cursor的方法if self._result is None:raise OperationalError("Invalid use of fetchall")fields = self._fields if self._fields is not None else taos_fetch_fields(self._result)buffer = [[] for i in range(len(fields))]self._rowcount = 0while True:block, num_of_rows = taos_fetch_block(self._result, self._fields)   # 关键逻辑errno = taos_errno(self._result)if errno != 0:raise ProgrammingError(taos_errstr(self._result), errno)if num_of_rows == 0:breakself._rowcount += num_of_rowsfor i in range(len(self._fields)):buffer[i].extend(block[i])return list(map(tuple, zip(*buffer)))def taos_fetch_block(result, fields=None, field_count=None):if fields is None:fields = taos_fetch_fields(result)if field_count is None:field_count = taos_field_count(result)pblock = ctypes.c_void_p(0)num_of_rows = _libtaos.taos_fetch_block(result, ctypes.byref(pblock))if num_of_rows == 0:return None, 0precision = taos_result_precision(result)blocks = [None] * field_countfor i in range(len(fields)):data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i]if fields[i]["type"] not in CONVERT_FUNC_BLOCK_v3 and fields[i]["type"] not in CONVERT_FUNC_BLOCK:raise DatabaseError("Invalid data type returned from database")offsets = []is_null = []if fields[i]["type"] in (FieldType.C_VARCHAR, FieldType.C_NCHAR, FieldType.C_JSON):offsets = taos_get_column_data_offset(result, i, num_of_rows)blocks[i] = CONVERT_FUNC_BLOCK_v3[fields[i]["type"]](data, is_null, num_of_rows, offsets, precision)else:is_null = [taos_is_null(result, j, i) for j in range(num_of_rows)]# 关键逻辑blocks[i] = CONVERT_FUNC_BLOCK[fields[i]["type"]](data, is_null, num_of_rows, offsets, precision)return blocks, abs(num_of_rows)CONVERT_FUNC_BLOCK = {FieldType.C_BOOL: _crow_bool_to_python,FieldType.C_TINYINT: _crow_tinyint_to_python,FieldType.C_SMALLINT: _crow_smallint_to_python,FieldType.C_INT: _crow_int_to_python,FieldType.C_BIGINT: _crow_bigint_to_python,FieldType.C_FLOAT: _crow_float_to_python,FieldType.C_DOUBLE: _crow_double_to_python,FieldType.C_BINARY: _crow_binary_to_python_block,FieldType.C_TIMESTAMP: _crow_timestamp_to_python,   # 关键逻辑FieldType.C_NCHAR: _crow_nchar_to_python_block,FieldType.C_TINYINT_UNSIGNED: _crow_tinyint_unsigned_to_python,FieldType.C_SMALLINT_UNSIGNED: _crow_smallint_unsigned_to_python,FieldType.C_INT_UNSIGNED: _crow_int_unsigned_to_python,FieldType.C_BIGINT_UNSIGNED: _crow_bigint_unsigned_to_python,FieldType.C_JSON: _crow_nchar_to_python_block,
}def _crow_timestamp_to_python(data, is_null, num_of_rows, nbytes=None, precision=FieldType.C_TIMESTAMP_UNKNOWN):"""Function to convert C bool row to python row."""_timestamp_converter = _convert_millisecond_to_datetime   # 关键逻辑if precision == FieldType.C_TIMESTAMP_MILLI:_timestamp_converter = _convert_millisecond_to_datetimeelif precision == FieldType.C_TIMESTAMP_MICRO:_timestamp_converter = _convert_microsecond_to_datetimeelif precision == FieldType.C_TIMESTAMP_NANO:_timestamp_converter = _convert_nanosecond_to_datetimeelse:raise DatabaseError("Unknown precision returned from database")return [None if is_null[i] else _timestamp_converter(ele)for i, ele in enumerate(ctypes.cast(data, ctypes.POINTER(ctypes.c_int64))[: abs(num_of_rows)])]def _convert_millisecond_to_datetime(milli):try:if _priv_tz is None:return _datetime_epoch + timedelta(seconds=milli / 1000.0)return (_utc_datetime_epoch + timedelta(seconds=milli / 1000.0)).astimezone(_priv_tz)  # 万恶之源except OverflowError:# catch OverflowError and passprint("WARN: datetime overflow!")pass

4. 最终修改和效果

修改ts字段的类型从C_TIMESTAMP改为C_BIGINT,相关逻辑如下,
参数说明:cursor 即TDHelper().cursor()获得,sql = ‘select ts,val from table_1 ORDER BY ts desc limit 1’
最后效果,50w数据从10s优化到3s

    def test(cursor, sql)try:cursor.execute(sql)# ts字段的类型修改为bigintif cursor._fields[0]._type == FieldType.C_TIMESTAMP:cursor._fields[0]._type = FieldType.C_BIGINTreturn cursor.fetchall()except ProgrammingError as e:if e.msg == 'Fail to get table info, error: Table does not exist':# 只输出sql,不需要输出异常信息logger.warning('Table does not exist, sql [{}]'.format(sql))return []raise e
http://www.yayakq.cn/news/744961/

相关文章:

  • 商业网站开发 说课开发app的网站
  • 郑州建站模板搭建百度有哪些网站可免费做软件推广
  • 给人做ppt的网站吗夫妻性做受视频什么网站
  • 移动端网站建设公司wordpress改动立马生效
  • 哪里有好的网站杭州网站建设有限公司
  • 济南市建设工程招投标协会网站公司开发网站建设
  • 济阳网站建设简单个人网站制作
  • 株洲建设工程造价信息网站wordpress 订阅邮箱下载
  • 本地的营销网站建设阿里巴巴网站怎么做才能排第一
  • 北京建站公司dhru商城网站建设
  • 品牌网站建设小h蝌蚪个人备案的网站可以做商城吗
  • 阿里巴巴网站建设论文建设部网站官网考试
  • 苏州吴中网站建设公司秦皇岛住房建设网站
  • 天津地铁建设网站广州电商小程序开发
  • 网站的建设成本的账务处理厦门建设局网站城市建设
  • html5做网站的代码wordpress主题带商城
  • 有域名了如何建网站攻击jsp网站
  • 四川建设厅证网站是手机评测网
  • 精美网站设计欣赏检察院门户网站建设工作成效
  • 河北住房和城乡建设厅官方网站公司经营范围网站开发及运营
  • 11网站建设waocc网站目录不能访问
  • 运城手机网站制作电子商务毕业设计网站建设业务
  • 企业网站建设框架单位网站维护 网站建设岗位
  • asp网站制作北京产品设计公司有哪些
  • 电商网站设计费用wordpress options
  • 网站开发工程师是干嘛的自己的网站首页背景怎么做
  • 新建茶叶网站文章内容建设东莞市企业网站建设哪家好
  • 网站如何做tag高校网站建设的文章
  • 网站首页设计html代码制作婚恋网站
  • 高校网站模板网页版梦幻西游勇闯火焰山攻略