我们有一个大型的简单数据集,有两列:张力。以及存储在 Snowflake 中的时间和外键 device_id。我们查询喜欢
def get_waveform(self, device_id):
sql = """
select tension, time from waveform
where device_id = %s;
"""
with self.conn.cursor() as cursor:
# This will take 12 minutes for one waveform.
results = cursor.execute(sql, (device_id,))
waveform = results.fetchall()
return waveform;
每个设备恰好有 5000 万行。在 Snowflake 中查询如此大量的数据在 1000Mbs 网络上大约需要 15 秒。然而,从 Python/psycopg2 执行此操作的时间长得无法使用 - 当我们使用 fetchall 时,大约需要 12 分钟。将查询拆分为每个 100 万个的小块并调用 fetchmany(1000000) 会使所有 50 个查询在 15 分钟左右的时间变得更糟。
我的猜测是大部分时间都花在解析客户端上的查询结果并创建结果数组上。除了转储 Python 并用一种编译语言重写所有内容之外,还有其他解决方法吗?
我研究了 fetch_all 的实现,它只是 fetchone 的迭代。相当令人失望。 我尝试获取 Pandas 框架,并且该实现更加优化。我得到了预期的 12 秒而不是 15 分钟。