Chunking · dtype downcast · Parquet · Views · UPDATE/DELETE · Permissions
ทำงานกับข้อมูลใหญ่กว่า RAM · table view/update · access control (BigQuery IAM)
df.memory_usage(deep=True).sum()/1e6 # MB # วัดก่อนเสมอ!
acc = {} # sum,n per group
for chunk in pd.read_csv(
'big.csv', chunksize=50_000,
usecols=['gender','hba1c']): # ← col pruning!
for g, sub in chunk.groupby('gender'):
s, n = acc.get(g, (0.0, 0))
acc[g] = (s+sub.hba1c.sum(), n+len(sub))
# combine:
mean = {g: round(s/n,3) for g,(s,n) in acc.items()}
| dtype เดิม | downcast | bytes | เงื่อนไข |
|---|---|---|---|
| int64 | int8/int16/int32 | 8→1/2/4 | range พอ (age≤127 → int8) |
| float64 | float32 | 8→4 | precision 7 หลักพอ (lab values) |
| object (str) | category | ~10× | cardinality ต่ำ (gender, ward) |
for c in df.select_dtypes('integer'):
df[c] = pd.to_numeric(df[c], downcast='integer')
df['gender'] = df['gender'].astype('category')
# via duckdb COPY
con.execute(\"\"\"
COPY (SELECT * FROM
read_csv_auto('big_vitals.csv'))
TO 'big_vitals.parquet'
(FORMAT PARQUET)\"\"\")
# or pandas:
df.to_parquet('x.parquet') # needs pyarrow
pd.read_parquet('x.parquet')
VIEW = saved query ชี้ไฟล์จริง — ไม่ copy data, ผล fresh ทุกครั้งที่ query
CREATE OR REPLACE VIEW v_vitals AS
SELECT * FROM read_parquet('big_vitals.parquet');
-- ใช้เหมือนตาราง:
SELECT age/10*10 decade, AVG(sbp)
FROM v_vitals GROUP BY decade;
-- vs TABLE AS (materialize):
CREATE TABLE t AS SELECT ...; -- copy จริง
| VIEW | TABLE | |
|---|---|---|
| Storage | 0 (query only) | copy ข้อมูล |
| Freshness | real-time | snapshot |
| Speed | re-compute | fast read |
-- pattern: BEGIN → check → commit/rollback BEGIN; -- ดูก่อนว่าจะกระทบกี่แถว: SELECT COUNT(*) FROM patients WHERE systolic_bp > 220; -- e.g. 5 UPDATE patients SET systolic_bp=NULL WHERE systolic_bp > 220; SELECT changes(); -- == 5 ? COMMIT; -- หรือ ROLLBACK;
-- DELETE: preview ก่อนเสมอ!
SELECT COUNT(*) FROM patients
WHERE patient_id NOT IN
(SELECT patient_id FROM rx);
-- แล้วค่อย DELETE ตามเงื่อนไขเดิม
| System | Model | ตัวอย่างการให้สิทธิ์ |
|---|---|---|
| SQLite/DuckDB | file-level OS | chmod 600 healthinfo.db (owner rw only) |
| PostgreSQL | roles + GRANT | GRANT SELECT ON patients TO analyst_ro; |
| BigQuery | IAM per project/dataset/table | roles/bigquery.dataViewer (read-only) |
ดร.วิชิต สมบัติ — wichit.s@ubu.ac.th
สัปดาห์หน้า: Project Consultation — เตรียม ERD + dataset proposal