MagicStack / MagicStack/asyncpg
cannot stream cursor on very large table
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 8.1k
- フォーク
- 468
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
-
asyncpg version: 0.18.3
-
PostgreSQL version: 9.6.8
-
Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
the issue with a local PostgreSQL install?: AWS Aurora Postgres. Tried connecting to both writer and read replica. Did not try local postgres. -
Python version: 3.7.3
-
Platform: macOS 10.14.5
-
Do you use pgbouncer?: No
-
Did you install asyncpg with pip?: Yes
-
If you built asyncpg locally, which version of Cython did you use?: N/A
-
Can the issue be reproduced under both asyncio and
uvloop?: Did not try.
I'm running into an issue with using cursors on a very large postgres table. The table has approximately 60 million rows. The table has only 8 columns and each row is very small. I'm trying to use a server side cursor to stream the results in (ordered) but it just completely freezes while establishing the con.cursor. This is my code:
import asyncio
import asyncpg
dsn = 'postgresql://...:...@....us-east-1.rds.amazonaws.com/...'
async def run():
con = await asyncpg.connect(dsn)
print(con)
async with con.transaction():
async for record in con.cursor('SELECT * FROM pageviews ORDER BY user_id', prefetch=10, timeout=2):
print(record)
await con.close()
loop = asyncio.get_event_loop()
loop.run_until_complete(run())
I tried using both the iterable cursor (with explicit prefetch) and the regular cursor and neither worked. The following psycopg2 code using a "named cursor" (server-side cursor) works properly:
import datetime
import psycopg2
from psycopg2.extras import RealDictCursor
cursor_name = datetime.datetime.now().isoformat()
dsn = 'postgresql://...:...@....us-east-1.rds.amazonaws.com/...'
conn = psycopg2.connect(dsn, cursor_factory=RealDictCursor)
with conn.cursor(cursor_name) as cursor:
sql = "SELECT * FROM pageviews ORDER BY user_id;"
cursor.execute(sql)
for i, row in enumerate(cursor):
print(i, row)
I need to stream the entire ordered table and perform a streaming groupby and then run some computation on each grouped object. I'm looking to asyncpg to decrease the IO time.
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
トランザクション内で、提供されている asyncpg.cursor 呼び出しから始め、大きく順序付けされた pageviews クエリと prefetch 設定を使用します。psycopg2 の名前付きカーソルの例とその動作を比較し、フリーズせずにストリーミングが開始されるかを確認します。報告されている PostgreSQL と Python のバージョンで、順序付けされた結果セットを段階的に消費できれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- postgresql, python
- 領域
- database
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100