แผนการเรียนรู้
/
AMMS 302 | Week 14

Techniques with Big Data

Chunking · dtype downcast · Parquet · Views · UPDATE/DELETE · Permissions

ทำงานกับข้อมูลใหญ่กว่า RAM · table view/update · access control (BigQuery IAM)

🎯 เป้าหมาย (CLO2/CLO4)

  • คำนวณ RAM footprint + เลือก chunk/downcast/columnar ให้ถูกสถานการณ์
  • UPDATE/DELETE แบบ transaction-guard + CREATE VIEW in-place
  • ออกแบบ permission plan (least privilege) สำหรับทีมวิจัย
Lab: 🧪 week14-bigdata-techniques.ipynb — benchmark จริงบนเครื่องเรา

สารบัญ

01 · RAM Math — รู้ก่อนพัง

float64 = 8 bytes / cell
100 cols × 1M rows = 800 MB
100 cols × 10M rows = 8 GB 💥
+ pandas overhead ~2× → crash บนเครื่อง 8GB RAM
df.memory_usage(deep=True).sum()/1e6   # MB
# วัดก่อนเสมอ!

Decision tree

  • < 25% RAM → pandas full load OK
  • 25–75% RAM → downcast/usecols/categories
  • > 75% RAM หรือ > RAM → chunking หรือ DuckDB/Parquet
  • TB scale → cloud DW (BigQuery)
💡 lab §1 วัดจริงกับ big_vitals.csv (200k rows จำลอง)

02 · Chunking — streaming aggregate

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()}

Diagram

big.csv (disk, 10GB)
chunk 50kchunk 50k
↓ aggregate each → merge accumulator
RAM peak ≈ 1 chunk (~5MB) ✓
ห้าม: append chunk เข้า list จนหมดไฟล์ = โหลดเต็มเหมือนเดิม!

03 · dtype downcasting

dtype เดิมdowncastbytesเงื่อนไข
int64int8/int16/int328→1/2/4range พอ (age≤127 → int8)
float64float328→4precision 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')
lab §3: ลด memory ได้ 50–70% บน dataset เดียวกัน · 📚 select_dtypes · Categorical guide

04 · Parquet — columnar binary format

CSV (row-based)
r1:a,b,c,d | r2:a,b,c,d …
↓ convert
Parquet (column chunks + encodings)
col_a: [v,v,v…] | col_b: […] (snappy/zstd)
  • compression 60–80% smaller
  • read เฉพาะ column + row-group (predicate pushdown)
  • typed schema ในตัว (ไม่เดา dtype!)
# 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')
💡 lab §4: CSV→Parquet เล็กลง ~70% + query เร็วขึ้น
📚 Official spec: parquet.apache.org · pandas to_parquet

05 · CREATE VIEW — ตารางเสมือน

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 จริง
VIEWTABLE
Storage0 (query only)copy ข้อมูล
Freshnessreal-timesnapshot
Speedre-computefast read
💡 BigQuery: view + authorized views = fine-grained sharing (tie wk10 privacy)

06 · UPDATE / DELETE — อย่างมีเซฟตี้เบ็ลต์

-- 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 ตามเงื่อนไขเดิม

Golden rules

  • WHERE ทุกครั้ง — UPDATE ไร้ WHERE = ล้างทั้งตาราง!
  • preview SELECT ด้วยเงื่อนไขเดิมก่อน execute
  • backup file (.db/.csv copy) ก่อน bulk ops
  • audit log: ใคร update อะไรเมื่อไร (BigQuery: Information Schema)
จำ wk10: update PHI ต้อง log + least privilege editor role

07 · Permission management — least privilege

SystemModelตัวอย่างการให้สิทธิ์
SQLite/DuckDBfile-level OSchmod 600 healthinfo.db (owner rw only)
PostgreSQLroles + GRANTGRANT SELECT ON patients TO analyst_ro;
BigQueryIAM per project/dataset/tableroles/bigquery.dataViewer (read-only)
Analyst
dataViewer — SELECT only
ETL service acct
dataEditor เฉพาะ staging dataset
PI/owner
admin + billing + audit logs on

08 · Lab สัปดาห์ที่ 14 🧪

  1. §1 generate big_vitals.csv 200k + วัด memory
  2. §2 chunked aggregate — เทียบผลกับ full-load
  3. §3 downcast → %saved
  4. §4 CSV→Parquet + view query timing
  5. §5 UPDATE bp>220 ด้วย rollback guard บน healthinfo.db

📝 Homework 14

  • Benchmark 400k rows: chunk(20k) vs duckdb — ตารางเวลา + สรุป 3 บรรทัด
  • Permission plan ½ หน้า สำหรับ project กลุ่ม (roles ตาม BQ IAM)
  • ส่ง .ipynb — งานนี้ป้อนเข้า project consultation สัปดาห์ 15

09 · แหล่งอ้างอิงทางการ

🦆 SQL engines & security

📬 ติดต่อ

ดร.วิชิต สมบัติ — wichit.s@ubu.ac.th

สัปดาห์หน้า: Project Consultation — เตรียม ERD + dataset proposal

Next: Week 15–16 Group Project 🚀