To process large datasets while maintaining constant memory usage, use streaming queries via sess.send_query(). This returns a StreamingResult that can be iterated in chunks.
Important: You must explicitly call stream_result.close() or use a with statement to release resources, otherwise subsequent queries may be blocked.
Example: Iterating through chunks manually:
from chdb import session as chs
sess = chs.Session()
# Example: Manual iteration using fetch()
rows_cnt = 0
stream_result = sess.send_query("SELECT * FROM numbers(200000)", "CSV")
while True:
chunk = stream_result.fetch()
if chunk is None:
break
rows_cnt += chunk.rows_read()
print(rows_cnt) # 200000
Example: Exporting to PyArrow/Delta Lake:
import pyarrow as pa
from deltalake import write_deltalake
from chdb import session as chs
sess = chs.Session()
stream_result = sess.send_query("SELECT * FROM numbers(100000)", "Arrow")
# Create RecordBatchReader with custom batch size
batch_reader = stream_result.record_batch(rows_per_batch=10000)
write_deltalake(
table_or_uri="./my_delta_table",
data=batch_reader,
mode="overwrite"
)
stream_result.close()
sess.close()