Spaces:
Sleeping
Sleeping
| """ | |
| make_lite_db.py | |
| Creates a deployment-ready stripped version of drugbank.db under 500MB. | |
| Keeps ALL drugs, targets, enzymes, food_interactions, pathways. | |
| Samples 500k interactions — priority drugs first, then sequential fill. | |
| Run from the Meta hackathon folder: | |
| python make_lite_db.py | |
| """ | |
| import sqlite3 | |
| import os | |
| SRC = "drugbank.db" | |
| DST = "drugbank_lite.db" | |
| PRIORITY_DRUGS = [ | |
| "Amlodipine", "Lisinopril", "Atenolol", "Hydrochlorothiazide", | |
| "Ramipril", "Metoprolol", "Valsartan", "Losartan", "Nifedipine", | |
| "Hydroflumethiazide", "Furosemide", "Spironolactone", | |
| "Metformin", "Glibenclamide", "Sitagliptin", "Empagliflozin", | |
| "Dapagliflozin", "Pioglitazone", "Glipizide", | |
| "Digoxin", "Carvedilol", "Bisoprolol", "Enalapril", | |
| "Sacubitril", "Ivabradine", "Torsemide", "Bumetanide", | |
| "Methotrexate", "Hydroxychloroquine", "Sulfasalazine", | |
| "Leflunomide", "Prednisolone", | |
| "Salbutamol", "Budesonide", "Fluticasone", "Salmeterol", | |
| "Montelukast", "Ipratropium", "Theophylline", | |
| "Valproate", "Carbamazepine", "Lamotrigine", "Levetiracetam", | |
| "Phenytoin", "Topiramate", "Oxcarbazepine", "Clonazepam", | |
| "Levothyroxine", "Liothyronine", | |
| "Sertraline", "Fluoxetine", "Escitalopram", "Venlafaxine", | |
| "Amitriptyline", "Mirtazapine", "Duloxetine", "Paroxetine", | |
| "Omeprazole", "Lansoprazole", "Pantoprazole", | |
| "Clarithromycin", "Amoxicillin", "Metronidazole", | |
| "Warfarin", "Apixaban", "Rivaroxaban", "Dabigatran", | |
| "Amiodarone", "Flecainide", "Sotalol", | |
| "Aspirin", "Ibuprofen", "Atorvastatin", "Simvastatin", | |
| "Clopidogrel", "Heparin", "Codeine", "Tramadol", | |
| ] | |
| TARGET_INTERACTIONS = 500000 | |
| if os.path.exists(DST): | |
| os.remove(DST) | |
| print(f"Removed existing {DST}") | |
| src = sqlite3.connect(SRC) | |
| dst = sqlite3.connect(DST) | |
| dst.execute("PRAGMA journal_mode=OFF") | |
| dst.execute("PRAGMA synchronous=OFF") | |
| dst.execute("PRAGMA cache_size=100000") | |
| src_cursor = src.cursor() | |
| def get_schema(table): | |
| src_cursor.execute("SELECT sql FROM sqlite_master WHERE type='table' AND name=?", (table,)) | |
| row = src_cursor.fetchone() | |
| return row[0] if row else None | |
| def copy_full_table(table): | |
| print(f"Copying ALL from {table}...", end=" ", flush=True) | |
| schema = get_schema(table) | |
| if not schema: | |
| print("not found.") | |
| return | |
| dst.execute(schema) | |
| src_cursor.execute(f"SELECT * FROM {table}") | |
| rows = src_cursor.fetchall() | |
| if rows: | |
| ph = ",".join(["?"] * len(rows[0])) | |
| dst.executemany(f"INSERT INTO {table} VALUES ({ph})", rows) | |
| dst.commit() | |
| print(f"{len(rows)} rows.") | |
| def copy_interactions(): | |
| print("Copying interactions...") | |
| schema = get_schema("interactions") | |
| if not schema: | |
| print(" Not found.") | |
| return | |
| dst.execute(schema) | |
| seen = set() | |
| total = 0 | |
| # Step 1: priority drugs | |
| print(" Step 1: priority drugs...", flush=True) | |
| for drug in PRIORITY_DRUGS: | |
| src_cursor.execute( | |
| "SELECT * FROM interactions WHERE drug1_name LIKE ? OR drug2_name LIKE ? LIMIT 5000", | |
| (drug, drug) | |
| ) | |
| rows = src_cursor.fetchall() | |
| new_rows = [r for r in rows if (r[0], r[2]) not in seen] | |
| for r in new_rows: | |
| seen.add((r[0], r[2])) | |
| if new_rows: | |
| ph = ",".join(["?"] * len(new_rows[0])) | |
| dst.executemany(f"INSERT INTO interactions VALUES ({ph})", new_rows) | |
| total += len(new_rows) | |
| dst.commit() | |
| print(f" Priority done: {total} rows") | |
| # Step 2: sequential fill to TARGET | |
| remaining = TARGET_INTERACTIONS - total | |
| if remaining > 0: | |
| print(f" Step 2: filling {remaining} more rows sequentially...", flush=True) | |
| BATCH = 5000 | |
| offset = 0 | |
| added = 0 | |
| while added < remaining: | |
| src_cursor.execute("SELECT * FROM interactions LIMIT ? OFFSET ?", (BATCH, offset)) | |
| rows = src_cursor.fetchall() | |
| if not rows: | |
| break | |
| new_rows = [] | |
| for r in rows: | |
| if added >= remaining: | |
| break | |
| key = (r[0], r[2]) | |
| if key not in seen: | |
| seen.add(key) | |
| new_rows.append(r) | |
| added += 1 | |
| if new_rows: | |
| ph = ",".join(["?"] * len(new_rows[0])) | |
| dst.executemany(f"INSERT INTO interactions VALUES ({ph})", new_rows) | |
| offset += BATCH | |
| if added % 50000 == 0 and added > 0: | |
| dst.commit() | |
| print(f" ...{total + added} so far", flush=True) | |
| dst.commit() | |
| total += added | |
| print(f" Step 2 done: added {added} rows") | |
| print(f" Total interactions: {total}") | |
| for table in ["drugs", "targets", "enzymes", "food_interactions", "pathways"]: | |
| copy_full_table(table) | |
| copy_interactions() | |
| src.close() | |
| print("Vacuuming...", end=" ", flush=True) | |
| dst.execute("VACUUM") | |
| dst.close() | |
| print("done.") | |
| size_mb = os.path.getsize(DST) / 1e6 | |
| print(f"\nResult: drugbank_lite.db = {size_mb:.1f} MB") | |
| if size_mb > 900: | |
| print("Still large — HF LFS should handle it fine up to 5GB.") | |
| else: | |
| print("Good to push to HuggingFace.") | |