jos*_*azo 5 python google-cloud-platform google-cloud-bigtable
查询BigTable时,我们遇到了一些性能问题。
查询约1400行时,监控仪表板中将获得约500行/秒的速度,而在与BigTable实例位于同一区域的计算机中运行下一个代码片段时,则需要约1.6秒:
partial_rows = instance.table(table_name).read_rows(filter_=row_filter, row_set=row_set)
ids = {}
for row in partial_rows:
key = row.row_key.decode()
category = key[0:5]
id_, year_month = key[5:].split('_')
dates = ids.get(id_, {})
for k, v in row.cells[column_family].items():
sub_key = k.decode()
day = sub_key[0:2]
measurement = f'{category}_{sub_key[3:]}'
date = datetime.date(int(year_month[0:4]), int(year_month[4:6]), int(day))
value = struct.unpack('>i', v[0].value)[0]
measurements = dates.get(date, {})
measurements[measurement] = value
dates[date] = measurements
ids[id_] = dates
Run Code Online (Sandbox Code Playgroud)
我们使用的表模式是:
{category}{id}_{year}{month}{day}{measurement_name}在我们的案例中,此架构完全遵循BigTable的准则。
该代码段非常简单,我们使用键和列名执行一些操作以创建如下所示的ids字典:
{
"4326": {
"2019-01-01": {
"value_a": 49
},
"2019-01-02": {
"value_a": 53
},
...
},
"3857": {
"2019-01-01": {
"value_a": 56
},
"2019-01-02": {
"value_a": 59
},
...
},
...
}
Run Code Online (Sandbox Code Playgroud)
您是否知道为什么我们的读取吞吐量如此之低?
有没有办法立即获取所有数据而不使用read_rows流生成器?甚至其他具有相同Python客户端或另一个客户端的解决方案,例如异步的解决方案。