🏹 MergenDB
"Big Data on Small Hardware"
MergenDB is an ultra-compact, columnar, embedded database engine and custom query language (MergenQL) designed to run analytical workloads on resource-constrained systems (Raspberry Pi, IoT gateways, low-end VPS, and edge devices) with maximum compression, zero memory exhaustion, and blazingly fast execution.👨💻 Author & Lead Developer: Uğur Türker Kebeci (@ugurturkerkebeci)
Named after Mergen, the ancient Turkic deity of wisdom, precision, and archery—who never misses his target.
📦 Installation
Install MergenDB directly from PyPI:
pip install mergendb
(MergenDB has zero external dependencies for its core engine—runs out of the box on Python 3.8+!)
⚡ Core Philosophy & Architecture
Traditional databases (MySQL, PostgreSQL, SQLite) store data in a row-oriented layout. If a table has 40 columns and you only query temperature and room, row-oriented engines must read all 40 columns from disk, wasting massive I/O bandwidth and RAM.
MergenDB redesigns storage from the silicon up:
flowchart TD
RawData["Raw Input Records (SQL / CSV / JSON / Dicts)"] --> Chunker["Vector Chunker (1024 - 4096 row vectors)"]
Chunker --> ColSlice["Columnar Vertical Partitioning"]
subgraph CompressionEngine ["Adaptive Compression Engine"]
ColSlice --> BitPack["Bit-Packing (8 Bools / Byte, Small Ints)"]
ColSlice --> Delta["Delta / Frame-of-Reference (Timestamps & IDs)"]
ColSlice --> Dict["Dictionary Encoding (Low-Cardinality Strings)"]
ColSlice --> RLE["Run-Length Encoding (Consecutive Repeated Data)"]
end
CompressionEngine --> ZoneMaps["ZoneMap Generator (Min/Max Indices per Chunk)"]
ZoneMaps --> Disk[".mgdb Columnar Binary Storage on Disk"]
1. 🗜️ Adaptive Hardware-Level Encodings
- Bit-Packing: 8 boolean values are packed into a single byte (8x compression).
- Delta / Frame-of-Reference (FoR): Art arda gelen ID'ler veya zaman damgalarında farklar saklanır (8-byte tamsayı yerine 1-2 byte).
- Dictionary Encoding: Tekrar eden metinler (status, category, city) 1-2 byte'lık ID tablolarına eşlenir.
- Run-Length Encoding (RLE): Art arda gelen aynı değerler tek bir sayaçla saklanır.
- Adaptive Selection: MergenDB her blokta en az yer kaplayan algoritmayı otomatik olarak tespit edip seçer.
2. 🎯 ZoneMap Indexing (Zero I/O Block Pruning)
Her veri bloğu minik bir min_val ve max_val üstverisi taşır. Eğer sorgunuz WHERE temperature > 40 ise ve bloğun tavanı 35 ise, MergenDB o bloğu diskten bile okumadan atlar.
3. ✂️ Column Pruning
Tabloda 50 sütun olsa bile sorgunuz 2 sütun istediyse, kalan 48 sütun diskten hiç okunmaz. Disk I/O darboğazı %90+ oranında yok edilir.
4. 🌊 Vectorized & Chunked Streaming (Zero OOM)
Veriler 2048'lik dilimler (chunk) halinde boru hattından akar. 109 Milyonluk dev bir veritabanı bile 512 MB RAM'li küçük bir cihazda belleği patlatmadan (Out Of Memory olmadan) işlenir.
📊 Benchmark: MergenDB vs SQLite vs JSON
Tested on 100,000 analytical telemetry records (12 columns per row):
| Depolama Formatı | Disk Boyutu | Boyut Oranı | Alan Tasarrufu | Disk I/O Okuma |
|---|---|---|---|---|
JSON Lines (.jsonl) |
~ 19.5 MB | 1.00x | %0.0 | ~ 19.5 MB |
| Standard SQL (SQLite) | 8.11 MB | 2.40x | %58.4 | 8.11 MB (Tüm tablo) |
MergenDB (.mgdb) |
1.65 MB | 11.80x | %91.5 | 0.29 MB (Sadece 2 sütun!) |
🚀 Sonuç: MergenDB SQLite'tan 5 kat, JSON'dan 12 kat daha küçüktür. Analitik sorgularda diski 27 kat daha az yorar!
📖 MergenQL & Komut Başvuru Kılavuzu (Cheat Sheet)
MergenDB'nin özgün sorgu dili MergenQL, verinin mantıksal olarak soldan sağa aktığı boru hattı (|) mimarisine dayanır.
1. Boru Hattı Aşamaları (Pipeline Stages)
| Komut | Açıklama | Örnek |
|---|---|---|
FROM |
Kaynak .mgdb dosyasını belirtir. |
FROM "telemetry.mgdb" |
WHERE |
Satırları filtreler (ZoneMap uyumludur). | | WHERE temp > 30.0 AND room == "Lab" |
COMPUTE |
Yeni hesaplanmış sütun üretir. | | COMPUTE temp_f = (temp * 1.8) + 32.0 |
SELECT |
Yansıtılacak sütunları seçer (Column Pruning). | | SELECT device_id, temp, temp_f |
AGGREGATE |
Özet fonksiyonları çalıştırır. | | AGGREGATE avg(temp) AS ortalama BY room |
SORT |
Sıralama yapar (ASC veya DESC). |
| SORT ortalama DESC |
LIMIT |
Sonuç satır sayısını sınırlar. | | LIMIT 10 |
2. Desteklenen Filtreleme Operatörleri (WHERE)
- Karşılaştırma:
==,=,!=,<>,<,<=,>,>= - Mantıksal:
AND,OR - Metin Arama:
LIKE(SQL%ve_joker karakterlerini destekler)
Örnek:| WHERE room LIKE "kit%"veya| WHERE email LIKE "%@gmail.com"
3. Agregasyon Fonksiyonları (AGGREGATE)
count(*)veyacount(col): Satır adedisum(col): Toplamavg(col): Aritmetik ortalamamin(col): En küçük değermax(col): En büyük değermedian(col): Medyan (ortanca) değerstddev(col): Standart sapma
📥 SQL & phpMyAdmin Veritabanlarını İçe Aktarma
1. phpMyAdmin veya MySQL Dump Dosyalarını Aktarma (.sql)
phpMyAdmin'den dışa aktarılan database.sql dosyalarını tek satırda dönüştürün (MySQL'e özel ENGINE=InnoDB, AUTO_INCREMENT, LOCK TABLES gibi fazlalıklar otomatik temizlenir):
import mergendb
table = mergendb.from_sql_dump("phpmyadmin_dump.sql", "database.mgdb")
print(f"Toplam {table.row_count:,} satır MergenDB'ye aktarıldı!")
2. SQLite Veritabanlarını Aktarma (.db, .sqlite)
table = mergendb.from_sqlite("legacy.db", "orders.mgdb", table_name="orders")
3. Canlı MySQL / PostgreSQL / Oracle Bağlantılarından Çekme
import pymysql
from mergendb.io.importer import DataImporter
conn = pymysql.connect(host="localhost", user="root", password="", database="eticaret")
cur = conn.cursor()
cur.execute("SELECT * FROM siparisler")
DataImporter.from_cursor(cur, output_mgdb_path="siparisler.mgdb")
4. CSV Dosyalarını Otomatik Tip Algılama ile Aktarma
table = mergendb.from_csv("sensor_data.csv", "sensor_data.mgdb")
💻 İnteraktif Terminal Kabuğu (REPL CLI)
Terminalden doğrudan MergenDB kabuğunu başlatın:
python -m mergendb.cli.repl
# veya
mergen
__ __ _____ ____
| \/ | | __ \| _ \
| \ / | ___ _ __ __ _ ___ _ __ | | | | |_) |
| |\/| |/ _ \ '__/ _` |/ _ \ '_ \ | | | | _ <
| | | | __/ | | (_| | __/ | | | | |__| | |_) |
|_| |_|\___|_| \__, |\___|_| |_| |_____/|____/
__/ |
|___/ v0.2.0 (Edge Columnar Engine)
mergen> .info telemetry.mgdb
--- Storage Footprint: telemetry.mgdb ---
Total Rows : 100,000
File Size on Disk : 1.65 MB
Compression Ratio : 11.80x (Saved 91.5% space)
mergen> .import sql backup.sql backup.mgdb
Successfully imported 250,000 rows in 320 ms
mergen> FROM "telemetry.mgdb"
...> | WHERE temp > 35.0 AND room LIKE "Server%"
...> | AGGREGATE avg(temp) AS ortalama, stddev(temp) AS sapma BY building
...> | SORT ortalama DESC
...> | LIMIT 5;
🧪 Test Paketini Çalıştırma
python -m unittest discover tests
(Tüm 16 birim testi sıfır hata ile geçmektedir).
👨💻 Yazar & İletişim
- Geliştirici: Uğur Türker Kebeci
- GitHub: @ugurturkerkebeci
- Proje Deposu: https://github.com/ugurturkerkebeci/MergenDB
- PyPI: https://pypi.org/project/mergendb/
📄 Lisans
Bu proje MIT Lisansı ile lisanslanmıştır. Açık kaynak dünyasına ve düşük donanımlı sistemlerde büyük veri analitiğine katkı sağlamak amacıyla geliştirilmiştir.
Metadata
Release files for mergendb 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mergendb-0.3.0.tar.gz | 41.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mergendb-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 79.7 kB
Release files / mergendb-0.3.0.tar.gz
| Download URL | mergendb-0.3.0.tar.gz |
|---|---|
| Size | 41.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4a8f5a000b2c1fb05fc4d0f902a681ef2b9832568e39c6ba72b18e168bce5b7c
|
|
BLAKE2b-256 checksum How to use checksums |
e392f98ef8c4edbbc5d981a3fae52d5e51b601d5ab67d4bcdd4b158b0f617a0a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.8.7rc1
|
Release files / mergendb-0.3.0-py3-none-any.whl
| Download URL | mergendb-0.3.0-py3-none-any.whl |
|---|---|
| Size | 38.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
be200bb62439d2593e50f0edcfcc00f2ba73f5b550cf8c4eae99da817c7dc966
|
|
BLAKE2b-256 checksum How to use checksums |
3962a9c9936fd4b8fc8d79329b66b2a89a5d4deb142e3db7af2e48a9a8e4c0cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.8.7rc1
|