{"id":30934,"date":"2025-10-03T16:32:23","date_gmt":"2025-10-03T13:32:23","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/"},"modified":"2025-10-03T16:32:23","modified_gmt":"2025-10-03T13:32:23","slug":"rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/","title":{"rendered":"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi"},"content":{"rendered":"<p>Rust projelerinizde veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in etkili bir \u00e7\u00f6z\u00fcm m\u00fc ar\u0131yorsunuz? Bu kapsaml\u0131 rehberde, disk tabanl\u0131 depolama i\u00e7in Heave k\u00fct\u00fcphanesini kullanarak verileri g\u00fcvenli ve performansl\u0131 bir \u015fekilde nas\u0131l saklayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedeceksiniz. D\u00fc\u015f\u00fck seviye kontrol ve y\u00fcksek performans\u0131n birle\u015fti\u011fi Heave ile veri y\u00f6netimi art\u0131k \u00e7ok daha kolay.<\/p>\n<p>Modern yaz\u0131l\u0131m uygulamalar\u0131, genellikle anl\u0131k i\u015flemlerin \u00f6tesine ge\u00e7en bir ya\u015fam d\u00f6ng\u00fcs\u00fcne sahiptir. Bir program kapat\u0131ld\u0131\u011f\u0131nda veya bir sistem yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda, uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 s\u0131ras\u0131nda \u00fcretilen veya i\u015flenen verilerin kaybolmamas\u0131 kritik \u00f6neme sahiptir. \u0130\u015fte bu noktada &#8220;veri kal\u0131c\u0131l\u0131\u011f\u0131&#8221; kavram\u0131 devreye girer. Veri kal\u0131c\u0131l\u0131\u011f\u0131, verilerin kal\u0131c\u0131 bir depolama ortam\u0131nda (\u00f6rne\u011fin disk, flash bellek) saklanarak, uygulaman\u0131n \u00f6mr\u00fcnden ba\u011f\u0131ms\u0131z olarak eri\u015filebilir olmas\u0131n\u0131 ifade eder.<\/p>\n<p>Rust gibi performans odakl\u0131 ve sistem programlamaya uygun dillerde veri kal\u0131c\u0131l\u0131\u011f\u0131, \u00f6zellikle g\u00f6m\u00fcl\u00fc sistemler, IoT cihazlar\u0131, sunucusuz mimariler veya y\u00fcksek performansl\u0131 g\u00fcnl\u00fckleme (logging) \u00e7\u00f6z\u00fcmleri gibi alanlarda b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu t\u00fcr senaryolarda, genellikle k\u0131s\u0131tl\u0131 kaynaklarla \u00e7al\u0131\u015f\u0131l\u0131r ve verilerin hem g\u00fcvenli hem de h\u0131zl\u0131 bir \u015fekilde saklanmas\u0131 gerekir. Geleneksel veritabanlar\u0131 bu t\u00fcr ortamlar i\u00e7in genellikle \u00e7ok a\u011f\u0131r veya karma\u015f\u0131k kalabilir. \u00d6rne\u011fin, bir IoT cihaz\u0131n\u0131n her saniye sens\u00f6r verisi g\u00f6ndermesi ve bu verilerin cihaz\u0131n kendi depolama biriminde ge\u00e7ici veya kal\u0131c\u0131 olarak saklanmas\u0131 gerekebilir. Elektrik kesintisi veya cihaz\u0131n yeniden ba\u015flat\u0131lmas\u0131 durumunda bu verilerin kaybolmamas\u0131 istenir.<\/p>\n<p>Peki, Rust&#8217;ta veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in hangi y\u00f6ntemler kullan\u0131labilir? Temelde \u00fc\u00e7 ana yakla\u015f\u0131m bulunur:<\/p>\n<ol>\n<li><strong>Dosya Sistemi Tabanl\u0131 Depolama:<\/strong> Verileri d\u00fcz metin dosyalar\u0131, CSV, JSON, binary formatlar veya \u00f6zel dosya yap\u0131lar\u0131 \u015feklinde do\u011frudan disk \u00fczerine yazmakt\u0131r. Bu y\u00f6ntem, esneklik sunar ancak veri b\u00fct\u00fcnl\u00fc\u011f\u00fc, e\u015f zamanl\u0131 eri\u015fim ve sorgulama gibi konularda geli\u015ftiricinin ek \u00e7aba sarf etmesini gerektirir.<\/li>\n<li><strong>Yerel Veritabanlar\u0131:<\/strong> SQLite, RocksDB, Sled gibi g\u00f6m\u00fclebilir (embedded) veritabanlar\u0131, genellikle daha geli\u015fmi\u015f \u00f6zellikler (ACID garantileri, indeksleme, sorgulama) sunar. Ancak bu veritabanlar\u0131 da belirli bir karma\u015f\u0131kl\u0131k ve kaynak t\u00fcketimi ile gelir.<\/li>\n<li><strong>\u00d6zel K\u00fct\u00fcphaneler ve Yap\u0131lar:<\/strong> Heave gibi k\u00fct\u00fcphaneler, dosya sistemi tabanl\u0131 depolama ile yerel veritabanlar\u0131 aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Genellikle daha basit, &#8220;append-only&#8221; (sadece ekleme) prensibiyle \u00e7al\u0131\u015f\u0131r ve belirli veri kal\u0131c\u0131l\u0131\u011f\u0131 ihtiya\u00e7lar\u0131 i\u00e7in optimize edilmi\u015ftir.<\/li>\n<\/ol>\n<p>Heave, tam da bu \u00fc\u00e7\u00fcnc\u00fc kategoriye girer ve Rust&#8217;\u0131n g\u00fcvenlik ve performans avantajlar\u0131n\u0131 disk tabanl\u0131, basit bir veri kal\u0131c\u0131l\u0131\u011f\u0131 \u00e7\u00f6z\u00fcm\u00fcyle birle\u015ftirir. \u00d6zellikle karma\u015f\u0131k bir veritaban\u0131 y\u00f6netim sistemine ihtiya\u00e7 duymadan, h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde veri saklamak isteyen projeler i\u00e7in ideal bir se\u00e7enektir. Bu sayede, uygulaman\u0131z\u0131n kal\u0131c\u0131l\u0131k gereksinimlerini minimum ek y\u00fck ile kar\u015f\u0131layabilirsiniz. Ayr\u0131ca Rust&#8217;\u0131n g\u00fc\u00e7l\u00fc tip sistemi, veri serile\u015ftirme ve depolama s\u00fcre\u00e7lerinde olas\u0131 hatalar\u0131 en aza indirmeye yard\u0131mc\u0131 olur, bu da veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc art\u0131r\u0131r.<\/p>\n<h2>Heave Nedir ve Rust Ekosistemindeki Yeri Nas\u0131ld\u0131r?<\/h2>\n<p>Heave, Rust i\u00e7in geli\u015ftirilmi\u015f, disk tabanl\u0131, append-only (sadece eklemeli) bir veri depolama k\u00fct\u00fcphanesidir. Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, &#8220;heave&#8221; kelimesi \u0130ngilizcede &#8220;a\u011f\u0131r bir \u015feyi kald\u0131rmak veya itmek&#8221; anlamlar\u0131na gelir, bu da k\u00fct\u00fcphanenin veri y\u00fcklerini verimli bir \u015fekilde y\u00f6netme kabiliyetini \u00e7a\u011fr\u0131\u015ft\u0131r\u0131r. Heave, geleneksel veritabanlar\u0131n\u0131n sundu\u011fu karma\u015f\u0131k \u00f6zelliklere ihtiya\u00e7 duymayan, ancak verilerin kal\u0131c\u0131 olarak saklanmas\u0131 gereken senaryolar i\u00e7in basit, h\u0131zl\u0131 ve dayan\u0131kl\u0131 bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>Heave&#8217;in temel felsefesi, verileri diske ard\u0131\u015f\u0131k bir \u015fekilde eklemektir. Bu &#8220;append-only&#8221; model, \u00f6zellikle loglama, olay kaynaklama (event sourcing), zaman serisi verileri veya sadece eklenen ve nadiren g\u00fcncellenen\/silinen veri setleri i\u00e7in olduk\u00e7a verimlidir. Veriler s\u00fcrekli olarak dosyan\u0131n sonuna yaz\u0131ld\u0131\u011f\u0131 i\u00e7in disk I\/O i\u015flemleri genellikle ard\u0131\u015f\u0131k ve h\u0131zl\u0131 olur. Bu durum, \u00f6zellikle manyetik disklerde veya eMMC\/NAND tabanl\u0131 depolama birimlerinde rastgele yazma i\u015flemlerine k\u0131yasla \u00f6nemli bir performans avantaj\u0131 sa\u011flar.<\/p>\n<p>Rust ekosisteminde Heave&#8217;in yeri olduk\u00e7a ni\u015f ama de\u011ferlidir. Rust&#8217;\u0131n statik tipleme, bellek g\u00fcvenli\u011fi ve performansa odaklanma gibi \u00f6zellikleriyle birle\u015fti\u011finde, Heave g\u00fcvenilir ve h\u0131zl\u0131 bir veri depolama katman\u0131 sunar. Di\u011fer pop\u00fcler Rust veri kal\u0131c\u0131l\u0131\u011f\u0131 \u00e7\u00f6z\u00fcmleriyle kar\u015f\u0131la\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda:<\/p>\n<ul>\n<li><strong>Sled:<\/strong> Sled, modern ve y\u00fcksek performansl\u0131 bir g\u00f6m\u00fclebilir anahtar-de\u011fer (key-value) veritaban\u0131d\u0131r. B-tree tabanl\u0131d\u0131r ve daha zengin bir API sunar (CRUD i\u015flemleri, atomik i\u015flemler). Heave&#8217;e g\u00f6re daha genel ama\u00e7l\u0131d\u0131r ve daha karma\u015f\u0131k veri modelleri i\u00e7in uygundur. Heave ise daha \u00e7ok bir g\u00fcnl\u00fckleme sistemi veya basit bir &#8220;veri ak\u0131\u015f\u0131&#8221; saklama arac\u0131 olarak konumlan\u0131r.<\/li>\n<li><strong>RocksDB \/ LevelDB ba\u011flay\u0131c\u0131lar\u0131:<\/strong> Bu k\u00fct\u00fcphaneler, C++&#8217;ta yaz\u0131lm\u0131\u015f pop\u00fcler anahtar-de\u011fer veritabanlar\u0131n\u0131n Rust ba\u011flay\u0131c\u0131lar\u0131d\u0131r. \u00c7ok y\u00fcksek performans ve \u00f6l\u00e7eklenebilirlik sunarlar, ancak daha karma\u015f\u0131k kurulum ve ba\u011f\u0131ml\u0131l\u0131klarla gelebilirler. Heave, saf Rust olmas\u0131 ve harici ba\u011f\u0131ml\u0131l\u0131klar\u0131 minimize etmesi a\u00e7\u0131s\u0131ndan daha hafiftir.<\/li>\n<li><strong>D\u00fcz dosya i\u015flemleri:<\/strong> Rust&#8217;\u0131n standart k\u00fct\u00fcphanesiyle do\u011frudan dosya yazma ve okuma i\u015flemleri yapmak m\u00fcmk\u00fcnd\u00fcr. Ancak bu, t\u00fcm veri b\u00fct\u00fcnl\u00fc\u011f\u00fc, e\u015f zamanl\u0131 eri\u015fim ve hata y\u00f6netimi sorumlulu\u011funu geli\u015ftiriciye b\u0131rak\u0131r. Heave, bu d\u00fc\u015f\u00fck seviye i\u015flemleri soyutlayarak daha g\u00fcvenli ve pratik bir API sunar.<\/li>\n<\/ul>\n<p>Heave&#8217;in en dikkat \u00e7ekici \u00f6zelliklerinden biri, <code>no_std<\/code> (standart k\u00fct\u00fcphane olmadan) ortamlar\u0131n\u0131 desteklemesidir. Bu \u00f6zellik, Heave&#8217;i bellek ve i\u015flemci k\u0131s\u0131tlamalar\u0131 olan mikrodenetleyiciler ve di\u011fer g\u00f6m\u00fcl\u00fc sistemler i\u00e7in cazip bir se\u00e7enek haline getirir. Bu t\u00fcr ortamlarda genellikle tam te\u015fekk\u00fcll\u00fc bir i\u015fletim sistemi ve dosya sistemi bulunmaz, ancak basit bir depolama mekanizmas\u0131na ihtiya\u00e7 duyulur.<\/p>\n<p>Sonu\u00e7 olarak, Heave, \u00f6zellikle \u015fu senaryolar i\u00e7in idealdir:<\/p>\n<ul>\n<li>Y\u00fcksek performansl\u0131 loglama ve olay kay\u0131t sistemleri.<\/li>\n<li>IoT cihazlar\u0131nda sens\u00f6r verilerinin kal\u0131c\u0131 olarak saklanmas\u0131.<\/li>\n<li>\u00d6nbellekler (cache) veya mesaj kuyruklar\u0131 gibi, verilerin s\u0131rayla eklendi\u011fi ve i\u015flendi\u011fi yap\u0131lar.<\/li>\n<li>Basit, schema-less (\u015femas\u0131z) veri depolama ihtiya\u00e7lar\u0131.<\/li>\n<li>Minimum ba\u011f\u0131ml\u0131l\u0131k ve <code>no_std<\/code> uyumlulu\u011fu gerektiren projeler.<\/li>\n<\/ul>\n<p>Heave, Rust&#8217;\u0131n g\u00fc\u00e7l\u00fc yanlar\u0131n\u0131 kullanarak, veri kal\u0131c\u0131l\u0131\u011f\u0131na sade ve etkili bir yakla\u015f\u0131m getiren, hafif ve g\u00fcvenilir bir k\u00fct\u00fcphanedir.<\/p>\n<h2>Heave ile Veri Saklamaya Ba\u015flamak: \u0130lk Ad\u0131mlar Nelerdir?<\/h2>\n<p>Heave k\u00fct\u00fcphanesini Rust projenize entegre etmek ve veri saklamaya ba\u015flamak olduk\u00e7a basittir. Ad\u0131m ad\u0131m ilerleyerek ilk Heave depolama alan\u0131n\u0131z\u0131 olu\u015fturacak, verileri yazacak ve okuyacaks\u0131n\u0131z.<\/p>\n<h3>1. <code>Cargo.toml<\/code> Ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 Ekleme<\/h3>\n<p>Heave&#8217;i projenize dahil etmek i\u00e7in \u00f6ncelikle <code>Cargo.toml<\/code> dosyan\u0131za <code>heave<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 eklemeniz gerekir. Projenizin k\u00f6k dizininde bulunan bu dosyay\u0131 a\u00e7\u0131n ve <code>[dependencies]<\/code> b\u00f6l\u00fcm\u00fcne a\u015fa\u011f\u0131daki sat\u0131r\u0131 ekleyin:<\/p>\n<pre><code>\n[dependencies]\nheave = \"0.1.0\" # En g\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin\nserde = { version = \"1.0\", features = [\"derive\"] }\nserde_json = \"1.0\"\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>heave<\/code> k\u00fct\u00fcphanesinin yan\u0131 s\u0131ra, Rust'ta veri serile\u015ftirme ve ters serile\u015ftirme i\u00e7in s\u0131k\u00e7a kullan\u0131lan <code>serde<\/code> ve <code>serde_json<\/code> k\u00fct\u00fcphanelerini de ekledik. Heave, <code>serde<\/code> ile do\u011frudan entegre \u00e7al\u0131\u015fmaz; verilerinizi Heave'e yazmadan \u00f6nce kendiniz serile\u015ftirip (\u00f6rne\u011fin JSON veya Bincode gibi formatlara) <code>&[u8]<\/code> dilimine d\u00f6n\u00fc\u015ft\u00fcrmeniz gerekir. Okurken de ters serile\u015ftirme yapman\u0131z gerekecektir. Bu esneklik, hangi format\u0131 kullanaca\u011f\u0131n\u0131za karar verme \u00f6zg\u00fcrl\u00fc\u011f\u00fc sunar.<\/p>\n<h3>2. Basit Bir Heave Depolama \u00d6rne\u011fi<\/h3>\n<p>\u015eimdi bir Rust dosyas\u0131 (<code>src\/main.rs<\/code> veya <code>src\/lib.rs<\/code>) olu\u015ftural\u0131m ve Heave ile temel i\u015flemleri ger\u00e7ekle\u015ftirelim.<\/p>\n<pre><code>\nuse heave::{Heave, Options};\nuse std::path::PathBuf;\nuse serde::{Serialize, Deserialize};\nuse std::io::{self, Cursor, Read};\n\n\/\/ Saklayaca\u011f\u0131m\u0131z veri yap\u0131s\u0131\n#[derive(Serialize, Deserialize, Debug)]\nstruct MyData {\n    id: u32,\n    message: String,\n    timestamp: u64,\n}\n\nfn main() -> io::Result<()> {\n    \/\/ Depolama dosyas\u0131n\u0131n yolu\n    let path = PathBuf::from(\"my_heave_data.bin\");\n\n    \/\/ Heave depolama alan\u0131n\u0131 a\u00e7ma veya olu\u015fturma\n    \/\/ Options::new().create(true) ile dosya yoksa olu\u015fturulur.\n    let mut heave = Heave::open(&path, Options::new().create(true))?;\n    println!(\"Heave depolama alan\u0131 a\u00e7\u0131ld\u0131\/olu\u015fturuldu: {:?}\", path);\n\n    \/\/ 1. Veri Yazma \u0130\u015flemi\n    let data1 = MyData {\n        id: 1,\n        message: \"Merhaba Heave!\".to_string(),\n        timestamp: 1678886400, \/\/ \u00d6rnek bir zaman damgas\u0131\n    };\n    let data2 = MyData {\n        id: 2,\n        message: \"Rust ile veri kal\u0131c\u0131l\u0131\u011f\u0131\".to_string(),\n        timestamp: 1678886460,\n    };\n\n    \/\/ Veriyi JSON format\u0131na serile\u015ftirip Heave'e yazal\u0131m\n    let serialized_data1 = serde_json::to_vec(&data1)?;\n    let serialized_data2 = serde_json::to_vec(&data2)?;\n\n    heave.append(&serialized_data1)?;\n    heave.append(&serialized_data2)?;\n    println!(\"\u0130ki veri \u00f6\u011fesi ba\u015far\u0131yla eklendi.\");\n\n    \/\/ Yaz\u0131lan verilerin diske senkronize edildi\u011finden emin olal\u0131m (iste\u011fe ba\u011fl\u0131 ama \u00f6nemli)\n    heave.sync_all()?; \n    println!(\"Veriler diske senkronize edildi.\");\n\n    \/\/ 2. Veri Okuma \u0130\u015flemi\n    println!(\"\\nHeave'den veriler okunuyor:\");\n    let mut reader = heave.reader()?;\n    \n    \/\/ Her bir kayd\u0131 okuyal\u0131m\n    while let Some(record) = reader.read_record()? {\n        let mut buffer = Vec::new();\n        let mut cursor = Cursor::new(record); \/\/ record: &[u8]\n        cursor.read_to_end(&mut buffer)?;\n\n        \/\/ JSON'dan ters serile\u015ftirme\n        match serde_json::from_slice::<MyData>(&buffer) {\n            Ok(deserialized_data) => {\n                println!(\"Okunan veri: {:?}\", deserialized_data);\n            }\n            Err(e) => {\n                eprintln!(\"Veri ters serile\u015ftirme hatas\u0131: {}\", e);\n            }\n        }\n    }\n\n    \/\/ Heave depolama alan\u0131n\u0131 kapatma (Heave nesnesi kapsam d\u0131\u015f\u0131na \u00e7\u0131kt\u0131\u011f\u0131nda otomatik kapan\u0131r)\n    \/\/ Ancak manuel olarak close() da \u00e7a\u011fr\u0131labilir, \u00f6zellikle kaynak y\u00f6netimi i\u00e7in.\n    \/\/ heave.close()?; \/\/ Bu sat\u0131ra gerek yok, <code>drop<\/code> trait'i ile otomatik halledilir.\n    println!(\"\\n\u0130\u015flemler tamamland\u0131. Heave depolama dosyas\u0131 kapand\u0131.\");\n\n    Ok(())\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, bir <code>MyData<\/code> yap\u0131s\u0131n\u0131 tan\u0131mlar, bu yap\u0131n\u0131n \u00f6rneklerini JSON'a serile\u015ftirir ve Heave depolama alan\u0131na yazar. Ard\u0131ndan, yaz\u0131lan verileri Heave'den okur ve tekrar <code>MyData<\/code> yap\u0131s\u0131na ters serile\u015ftirir. <code>heave.sync_all()?<\/code> \u00e7a\u011fr\u0131s\u0131, verilerin ger\u00e7ekten diske yaz\u0131ld\u0131\u011f\u0131ndan emin olmak i\u00e7in \u00f6nemlidir; aksi takdirde veriler i\u015fletim sisteminin belle\u011findeki \u00f6nbelleklerde kalabilir ve bir elektrik kesintisi durumunda kaybolabilir.<\/p>\n<h3>3. Hata Y\u00f6netimi<\/h3>\n<p>Rust'ta hata y\u00f6netimi genellikle <code>Result<\/code> enum'\u0131 ile yap\u0131l\u0131r. Heave k\u00fct\u00fcphanesindeki \u00e7o\u011fu i\u015flem de <code>io::Result<\/code> d\u00f6nd\u00fcr\u00fcr. Yukar\u0131daki \u00f6rnekte <code>?<\/code> operat\u00f6r\u00fc kullan\u0131larak hatalar ana <code>main<\/code> fonksiyonuna yay\u0131ld\u0131. Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, bu hatalar\u0131 daha spesifik bir \u015fekilde ele alman\u0131z gerekebilir (\u00f6rne\u011fin, kullan\u0131c\u0131ya hata mesaj\u0131 g\u00f6stermek, loglamak veya kurtarma stratejileri uygulamak). Heave'in kendi <code>Error<\/code> tipi yoktur, bunun yerine standart <code>std::io::Error<\/code> kullan\u0131r, bu da onunla etkile\u015fimi basitle\u015ftirir.<\/p>\n<p class=\"expert-tip\">Uzman \u0130pucu: Serile\u015ftirme format\u0131 se\u00e7imi projenizin ihtiya\u00e7lar\u0131na g\u00f6re de\u011fi\u015fir. JSON insan taraf\u0131ndan okunabilirken, Bincode veya MessagePack gibi binary formatlar daha k\u00fc\u00e7\u00fck dosya boyutlar\u0131 ve daha h\u0131zl\u0131 serile\u015ftirme\/ters serile\u015ftirme s\u00fcreleri sunar. \u00d6zellikle performans\u0131n kritik oldu\u011fu veya depolama alan\u0131n\u0131n k\u0131s\u0131tl\u0131 oldu\u011fu durumlarda binary formatlar\u0131 tercih edin.<\/p>\n<p>Bu ilk ad\u0131mlarla, Heave'in temel i\u015fleyi\u015fini kavrad\u0131n\u0131z. Art\u0131k daha karma\u015f\u0131k senaryolara ge\u00e7i\u015f yapabiliriz.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Bir Uygulama \u0130\u00e7in Heave Nas\u0131l Kullan\u0131l\u0131r?<\/h2>\n<p>Heave'in append-only yap\u0131s\u0131, belirli ger\u00e7ek d\u00fcnya senaryolar\u0131nda e\u015fsiz avantajlar sunar. \u015eimdi, bu avantajlar\u0131 somutla\u015ft\u0131rmak i\u00e7in bir \"sens\u00f6r verisi g\u00fcnl\u00fckleme\" uygulamas\u0131 geli\u015ftirelim. Bu senaryo, \u00f6zellikle IoT cihazlar\u0131 veya g\u00f6m\u00fcl\u00fc sistemler i\u00e7in olduk\u00e7a yayg\u0131nd\u0131r.<\/p>\n<h3>Vaka Analizi: IoT Sens\u00f6r Verisi Toplay\u0131c\u0131s\u0131<\/h3>\n<p>Bir ak\u0131ll\u0131 tar\u0131m projesi i\u00e7in uzaktan s\u0131cakl\u0131k, nem ve toprak pH de\u011ferlerini \u00f6l\u00e7en bir dizi IoT sens\u00f6r\u00fcm\u00fcz oldu\u011funu varsayal\u0131m. Bu sens\u00f6rler, her 5 dakikada bir veri topluyor ve bu verileri cihaz\u0131n yerel depolama birimine yaz\u0131yor. Cihaz\u0131n internet ba\u011flant\u0131s\u0131 kesildi\u011finde veya ge\u00e7ici olarak kullan\u0131lamad\u0131\u011f\u0131nda, toplanan verilerin kaybolmamas\u0131 ve ba\u011flant\u0131 yeniden sa\u011fland\u0131\u011f\u0131nda merkezi bir sunucuya g\u00f6nderilebilmesi gerekiyor. Heave, bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in hafif, performansl\u0131 ve g\u00fcvenilir bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h3>Uygulama Mimarisi ve Heave Entegrasyonu<\/h3>\n<p>Uygulamam\u0131z \u015fu ad\u0131mlar\u0131 i\u00e7erecek:<\/p>\n<ol>\n<li>Sens\u00f6r verilerini temsil eden bir yap\u0131 tan\u0131mlama.<\/li>\n<li>Bu verileri JSON format\u0131na serile\u015ftirerek Heave depolama alan\u0131na yazma.<\/li>\n<li>\u0130stenildi\u011finde, Heave'deki t\u00fcm verileri okuyup i\u015fleme (\u00f6rne\u011fin, bir sunucuya g\u00f6nderme veya bir rapor olu\u015fturma).<\/li>\n<li>(\u0130leri seviye) Verilerin i\u015flendi\u011fini i\u015faretleme veya Heave dosyas\u0131n\u0131 y\u00f6netme.<\/li>\n<\/ol>\n<p>\u015eimdi kod \u00fczerinde bu ad\u0131mlar\u0131 inceleyelim:<\/p>\n<pre><code>\nuse heave::{Heave, Options};\nuse serde::{Serialize, Deserialize};\nuse std::path::PathBuf;\nuse std::io::{self, Cursor, Read};\nuse chrono::{Utc, DateTime}; \/\/ Zaman damgalar\u0131 i\u00e7in <code>chrono<\/code> k\u00fct\u00fcphanesi\n\n\/\/ Cargo.toml'a eklemeyi unutmay\u0131n:\n\/\/ chrono = { version = \"0.4\", features = [\"serde\"] }\n\n\/\/ Sens\u00f6r veri yap\u0131s\u0131\n#[derive(Serialize, Deserialize, Debug)]\nstruct SensorData {\n    device_id: String,\n    sensor_type: String, \/\/ \"temperature\", \"humidity\", \"pH\"\n    value: f32,\n    #[serde(with = \"chrono::serde::ts_seconds\")]\n    timestamp: DateTime<Utc>,\n}\n\n\/\/\/ Sens\u00f6r verilerini Heave dosyas\u0131na yazan fonksiyon\nfn log_sensor_data(heave: &mut Heave, data: SensorData) -> io::Result<()> {\n    let serialized_data = serde_json::to_vec(&data)?;\n    heave.append(&serialized_data)?;\n    heave.sync_all()?; \/\/ Verinin diske yaz\u0131ld\u0131\u011f\u0131ndan emin ol\n    println!(\"Logland\u0131: {:?}\", data);\n    Ok(())\n}\n\n\/\/\/ Heave dosyas\u0131ndaki t\u00fcm verileri okuyup i\u015fleyen fonksiyon\nfn process_all_logged_data(heave: &mut Heave) -> io::Result<()> {\n    println!(\"\\nDepolanan veriler i\u015fleniyor...\");\n    let mut reader = heave.reader()?;\n    let mut processed_count = 0;\n\n    \/\/ Her bir kayd\u0131 okuyup ters serile\u015ftirelim\n    while let Some(record) = reader.read_record()? {\n        let mut buffer = Vec::new();\n        let mut cursor = Cursor::new(record);\n        cursor.read_to_end(&mut buffer)?;\n\n        match serde_json::from_slice::<SensorData>(&buffer) {\n            Ok(data) => {\n                \/\/ Burada veriyi merkezi bir sunucuya g\u00f6nderme, analiz etme vb. i\u015flemler yap\u0131labilir.\n                println!(\"\u0130\u015flendi: Device ID: {}, Type: {}, Value: {}, Time: {}\", \n                         data.device_id, data.sensor_type, data.value, data.timestamp);\n                processed_count += 1;\n            }\n            Err(e) => {\n                eprintln!(\"Kay\u0131t ters serile\u015ftirme hatas\u0131: {}\", e);\n            }\n        }\n    }\n    println!(\"{} adet veri ba\u015far\u0131yla i\u015flendi.\", processed_count);\n    Ok(())\n}\n\n\nfn main() -> io::Result<()> {\n    let path = PathBuf::from(\"sensor_logs.heave\");\n\n    \/\/ Heave depolama alan\u0131n\u0131 a\u00e7ma\/olu\u015fturma\n    let mut heave = Heave::open(&path, Options::new().create(true))?;\n    println!(\"Sens\u00f6r log depolamas\u0131 a\u00e7\u0131ld\u0131: {:?}\", path);\n\n    \/\/ Rastgele sens\u00f6r verileri \u00fcretip loglayal\u0131m\n    for i in 0..5 {\n        let temp_data = SensorData {\n            device_id: \"IOT-T-001\".to_string(),\n            sensor_type: \"temperature\".to_string(),\n            value: 25.0 + (i as f32 * 0.5), \/\/ S\u0131cakl\u0131k art\u0131\u015f\u0131\n            timestamp: Utc::now(),\n        };\n        log_sensor_data(&mut heave, temp_data)?;\n\n        let hum_data = SensorData {\n            device_id: \"IOT-H-002\".to_string(),\n            sensor_type: \"humidity\".to_string(),\n            value: 60.0 - (i as f32 * 0.8), \/\/ Nem d\u00fc\u015f\u00fc\u015f\u00fc\n            timestamp: Utc::now(),\n        };\n        log_sensor_data(&mut heave, hum_data)?;\n        \n        std::thread::sleep(std::time::Duration::from_millis(50)); \/\/ Sim\u00fclasyon gecikmesi\n    }\n\n    \/\/ Depolanm\u0131\u015f t\u00fcm verileri i\u015fleyelim\n    process_all_logged_data(&mut heave)?;\n\n    \/\/ Not: Heave append-only oldu\u011fu i\u00e7in, i\u015flenen verileri do\u011frudan silmek yerine,\n    \/\/ genellikle yeni bir dosya olu\u015fturup i\u015flenmemi\u015f verileri oraya kopyalama\n    \/\/ veya i\u015flenen kay\u0131tlar\u0131 farkl\u0131 bir dosyaya ta\u015f\u0131ma gibi stratejiler kullan\u0131l\u0131r.\n    \/\/ Ya da, okuyucunun konumunu takip edip, belirli bir noktaya kadar olan verilerin\n    \/\/ i\u015flendi\u011fini harici bir indeksle i\u015faretleyebilirsiniz.\n\n    println!(\"\\nSim\u00fclasyon tamamland\u0131. \u00c7\u0131k\u0131l\u0131yor.\");\n\n    Ok(())\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Veri Modellemesi ve Serile\u015ftirme<\/h3>\n<p>Yukar\u0131daki \u00f6rnekte <code>SensorData<\/code> yap\u0131s\u0131, sens\u00f6rden gelen verileri temsil eder. <code>#[derive(Serialize, Deserialize, Debug)]<\/code> anotasyonlar\u0131, <code>serde<\/code> k\u00fct\u00fcphanesinin bu yap\u0131y\u0131 JSON gibi formatlara otomatik olarak serile\u015ftirmesini ve ters serile\u015ftirmesini sa\u011flar. <code>chrono<\/code> k\u00fct\u00fcphanesi ile zaman damgalar\u0131 do\u011fru bir \u015fekilde y\u00f6netilir.<\/p>\n<h3>Veri Yazma ve Okuma \u0130\u015flemleri<\/h3>\n<p><code>log_sensor_data<\/code> fonksiyonu, gelen <code>SensorData<\/code>'y\u0131 JSON'a d\u00f6n\u00fc\u015ft\u00fcrerek <code>heave.append()<\/code> metodu ile depolama dosyas\u0131na ekler. <code>heave.sync_all()<\/code> \u00e7a\u011fr\u0131s\u0131, verilerin diske an\u0131nda yaz\u0131lmas\u0131n\u0131 garantileyerek veri kayb\u0131 riskini azalt\u0131r. <code>process_all_logged_data<\/code> fonksiyonu ise <code>heave.reader()<\/code> ile bir okuyucu elde eder ve <code>read_record()<\/code> metodunu kullanarak kay\u0131tlar\u0131 s\u0131rayla okur. Her kay\u0131t <code>&[u8]<\/code> dilimi olarak d\u00f6nd\u00fcr\u00fcld\u00fc\u011f\u00fc i\u00e7in, bu veriyi <code>serde_json::from_slice<\/code> ile tekrar <code>SensorData<\/code> yap\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrebiliriz.<\/p>\n<h3>Disk Alan\u0131 Y\u00f6netimi ve Performans G\u00f6zlemleri<\/h3>\n<p>Heave'in append-only do\u011fas\u0131 gere\u011fi, dosya boyutu s\u00fcrekli artar. Bu, \u00f6zellikle s\u0131n\u0131rl\u0131 depolama alan\u0131na sahip IoT cihazlar\u0131 i\u00e7in bir sorun te\u015fkil edebilir. \u00c7\u00f6z\u00fcm olarak:<\/p>\n<ul>\n<li><strong>S\u0131k\u0131\u015ft\u0131rma:<\/strong> Verileri Heave'e yazmadan \u00f6nce s\u0131k\u0131\u015ft\u0131rabilirsiniz (\u00f6rne\u011fin <code>flate2<\/code> veya <code>lz4<\/code> gibi k\u00fct\u00fcphanelerle).<\/li>\n<li><strong>D\u00f6ng\u00fcsel Depolama:<\/strong> Belirli bir boyuta ula\u015f\u0131ld\u0131\u011f\u0131nda en eski verileri silmek veya yeni bir dosya olu\u015fturmak. Heave do\u011frudan silme\/g\u00fcncelleme sa\u011flamad\u0131\u011f\u0131 i\u00e7in, bu genellikle yeni bir Heave dosyas\u0131 olu\u015fturup sadece i\u015flenmemi\u015f veya saklanmas\u0131 gereken verileri bu yeni dosyaya kopyalayarak yap\u0131l\u0131r. Eski dosya daha sonra silinebilir.<\/li>\n<li><strong>\u0130\u015faretleme:<\/strong> \u0130\u015flenen kay\u0131tlar\u0131 silmek yerine, harici bir mekanizma (ba\u015fka bir k\u00fc\u00e7\u00fck dosya veya Heave kayd\u0131) ile hangi kay\u0131tlar\u0131n i\u015flendi\u011fini i\u015faretleyebilirsiniz. Okuma i\u015flemi s\u0131ras\u0131nda, sadece i\u015flenmemi\u015f kay\u0131tlar\u0131 okuyarak ilerleyebilirsiniz.<\/li>\n<\/ul>\n<p>Heave'in performans avantaj\u0131, ard\u0131\u015f\u0131k yazma ve okuma i\u015flemlerinde ortaya \u00e7\u0131kar. \u00d6zellikle binlerce k\u00fc\u00e7\u00fck veriyi h\u0131zl\u0131ca diske kaydetmeniz gerekti\u011finde, Heave'in d\u00fc\u015f\u00fck seviye kontrol\u00fc ve basit yap\u0131s\u0131, karma\u015f\u0131k bir veritaban\u0131na k\u0131yasla daha az kaynak t\u00fcketir ve daha y\u00fcksek I\/O performans\u0131 sa\u011flar.<\/p>\n<p class=\"expert-tip\">Uzman \u0130pucu: B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken, <code>sync_all()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131n her append i\u015fleminden sonra yap\u0131lmas\u0131 performans\u0131 d\u00fc\u015f\u00fcrebilir. E\u011fer veri kayb\u0131 tolerans\u0131n\u0131z varsa, <code>sync_all()<\/code> \u00e7a\u011fr\u0131lar\u0131n\u0131 belirli aral\u0131klarla (\u00f6rne\u011fin her 100 kay\u0131tta bir veya her 5 saniyede bir) yapmak, yazma performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n<p>Bu vaka analizi, Heave'in ger\u00e7ek bir uygulamada nas\u0131l kullan\u0131labilece\u011fine dair somut bir \u00f6rnek sunmaktad\u0131r. Basit ama etkili yap\u0131s\u0131yla, veri kal\u0131c\u0131l\u0131\u011f\u0131 ihtiya\u00e7lar\u0131n\u0131z\u0131 kolayca kar\u015f\u0131layabilirsiniz.<\/p>\n<h3>Heave'in Temel \u00d6zellikleri ve Veri Yap\u0131lar\u0131 Nelerdir?<\/h3>\n<p>Heave k\u00fct\u00fcphanesi, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, basit ve odaklanm\u0131\u015f bir dizi \u00f6zellik sunar. Temel amac\u0131, disk \u00fczerinde g\u00fcvenilir ve performans\u0131 y\u00fcksek bir append-only (sadece eklemeli) depolama katman\u0131 sa\u011flamakt\u0131r. Heave, tam te\u015fekk\u00fcll\u00fc bir veritaban\u0131 olmaktan ziyade, belirli depolama ihtiya\u00e7lar\u0131 i\u00e7in optimize edilmi\u015f, d\u00fc\u015f\u00fck seviyeli bir yap\u0131 ta\u015f\u0131 olarak konumland\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<h4>Heave'in \u00c7ekirdek Yap\u0131lar\u0131: <code>Heave<\/code> ve <code>HeaveReader<\/code><\/h4>\n<ul>\n<li>\n        <strong><code>Heave<\/code> Yap\u0131s\u0131:<\/strong> Bu, depolama dosyas\u0131n\u0131n kendisini temsil eden ana yap\u0131d\u0131r. Bir <code>Heave<\/code> nesnesi olu\u015fturdu\u011funuzda veya a\u00e7t\u0131\u011f\u0131n\u0131zda, asl\u0131nda disk \u00fczerindeki belirli bir dosya ile etkile\u015fime ge\u00e7ersiniz. <code>Heave<\/code> nesnesi arac\u0131l\u0131\u011f\u0131yla yeni verileri <code>append<\/code> (ekleme) edebilir, dosyan\u0131n boyutunu alabilir ve <code>sync_all<\/code> ile verilerin diske kal\u0131c\u0131 olarak yaz\u0131lmas\u0131n\u0131 sa\u011flayabilirsiniz. Verileri her zaman dosyan\u0131n sonuna ekler, bu da disk yazma i\u015flemlerini ard\u0131\u015f\u0131k hale getirerek performans\u0131 art\u0131r\u0131r.<\/p>\n<pre><code>\nlet mut heave = Heave::open(&path, Options::new().create(true))?;\nheave.append(&data)?;\nheave.sync_all()?;\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong><code>HeaveReader<\/code> Yap\u0131s\u0131:<\/strong> Verileri okumak i\u00e7in kullan\u0131l\u0131r. Bir <code>Heave<\/code> nesnesinden <code>reader()<\/code> metodu \u00e7a\u011fr\u0131larak elde edilir. <code>HeaveReader<\/code>, depolama dosyas\u0131ndaki kay\u0131tlar\u0131 ba\u015ftan sona s\u0131rayla okuman\u0131z\u0131 sa\u011flar. <code>read_record()<\/code> metodu, bir sonraki kayd\u0131 <code>&[u8]<\/code> dilimi olarak d\u00f6nd\u00fcr\u00fcr. Bu dilim, orijinal serile\u015ftirilmi\u015f verinizi i\u00e7erir ve sizin taraf\u0131n\u0131zdan ters serile\u015ftirilmesi gerekir.<\/p>\n<pre><code>\nlet mut reader = heave.reader()?;\nwhile let Some(record) = reader.read_record()? {\n    \/\/ record'u i\u015fleme\n}\n        <\/pre>\n<p><\/code><br \/>\n        Bu yakla\u015f\u0131m, \u00f6zellikle b\u00fcy\u00fck veri k\u00fcmeleri \u00fczerinde iterator benzeri bir okuma deneyimi sunar ve belle\u011fi verimli kullanman\u0131za olanak tan\u0131r, \u00e7\u00fcnk\u00fc her kayd\u0131 tek tek belle\u011fe y\u00fckler.\n    <\/li>\n<\/ul>\n<h4>Append-Only Prensibi ve Avantajlar\u0131<\/h4>\n<p>Heave'in en temel \u00f6zelli\u011fi, \"append-only\" (sadece eklemeli) olmas\u0131d\u0131r. Bu, bir kez yaz\u0131lan bir verinin do\u011frudan g\u00fcncellenemeyece\u011fi veya silinemeyece\u011fi anlam\u0131na gelir. Yeni veriler her zaman dosyan\u0131n sonuna eklenir. Bu prensibin \u00f6nemli avantajlar\u0131 vard\u0131r:<\/p>\n<ul>\n<li>\n        <strong>Performans:<\/strong> Disk yazma i\u015flemleri genellikle ard\u0131\u015f\u0131k oldu\u011fundan, rastgele yazma i\u015flemlerine g\u00f6re \u00e7ok daha h\u0131zl\u0131d\u0131r. Bu, y\u00fcksek yazma y\u00fck\u00fc olan sistemler i\u00e7in idealdir.\n    <\/li>\n<li>\n        <strong>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc ve Kurtarma:<\/strong> Bir yazma i\u015flemi s\u0131ras\u0131nda sistem \u00e7\u00f6kerse, genellikle sadece son kay\u0131t bozuk olabilir. \u00d6nceki kay\u0131tlar sa\u011flam kal\u0131r. Bu durum, veri kayb\u0131 riskini azalt\u0131r ve kurtarma s\u00fcre\u00e7lerini basitle\u015ftirir. Log dosyalar\u0131 veya olay g\u00fcnl\u00fckleri gibi senaryolarda bu \u00f6zellik hayati \u00f6neme sahiptir.\n    <\/li>\n<li>\n        <strong>Basitlik:<\/strong> Veritabanlar\u0131n\u0131n karma\u015f\u0131k indeksleme, kilitleme mekanizmalar\u0131 ve i\u015flem (transaction) y\u00f6netimi gibi \u00f6zelliklerine ihtiya\u00e7 duymaz, bu da k\u00fct\u00fcphaneyi daha hafif ve kullan\u0131m\u0131 daha kolay hale getirir.<\/li>\n<li>\n        <strong>Snapshot Alma:<\/strong> Belirli bir an itibar\u0131yla dosyan\u0131n bir kopyas\u0131n\u0131 almak kolayd\u0131r, \u00e7\u00fcnk\u00fc mevcut t\u00fcm veriler dosyan\u0131n \u00f6nceki b\u00f6l\u00fcmlerinde de\u011fi\u015fmeden durur.\n    <\/li>\n<\/ul>\n<h4>Veri Silme veya G\u00fcncelleme Nas\u0131l Yap\u0131l\u0131r?<\/h4>\n<p>Heave'in append-only do\u011fas\u0131 gere\u011fi, do\u011frudan bir \"silme\" veya \"g\u00fcncelleme\" operasyonu bulunmaz. Ancak bu, verileri hi\u00e7 silemeyece\u011finiz veya g\u00fcncelleyemeyece\u011finiz anlam\u0131na gelmez; sadece bunu dolayl\u0131 yollarla yapman\u0131z gerekir:<\/p>\n<ul>\n<li>\n        <strong>Mant\u0131ksal Silme\/G\u00fcncelleme:<\/strong> Yeni bir kay\u0131t ekleyerek eski kayd\u0131 ge\u00e7ersiz k\u0131labilirsiniz. \u00d6rne\u011fin, bir <code>Person<\/code> kayd\u0131n\u0131 g\u00fcncellerken, <code>id<\/code> alan\u0131 ayn\u0131 olan yeni bir <code>Person<\/code> kayd\u0131 eklersiniz ve okuma s\u0131ras\u0131nda her zaman en son <code>id<\/code>'ye sahip kayd\u0131 tercih edersiniz. Silme i\u00e7in de, <code>is_deleted: true<\/code> gibi bir flag i\u00e7eren \u00f6zel bir \"silme kayd\u0131\" ekleyebilirsiniz.\n    <\/li>\n<li>\n        <strong>Dosya S\u0131k\u0131\u015ft\u0131rma (Compaction):<\/strong> Periyodik olarak (\u00f6rne\u011fin, dosya belirli bir boyuta ula\u015ft\u0131\u011f\u0131nda veya \u00e7ok fazla \"mant\u0131ksal olarak silinmi\u015f\" kay\u0131t oldu\u011funda), yeni bir Heave dosyas\u0131 olu\u015fturursunuz. Eski dosyay\u0131 ba\u015ftan sona okuyarak sadece ge\u00e7erli (silinmemi\u015f ve en g\u00fcncel) kay\u0131tlar\u0131 yeni dosyaya yazars\u0131n\u0131z. \u0130\u015flem tamamland\u0131\u011f\u0131nda, eski dosyay\u0131 silebilirsiniz. Bu, veritabanlar\u0131ndaki \"compaction\" veya \"garbage collection\" i\u015flemine benzer.<\/li>\n<\/ul>\n<p>Heave'in temel \u00f6zellikleri ve veri yap\u0131lar\u0131, onu belirli depolama ihtiya\u00e7lar\u0131 i\u00e7in olduk\u00e7a uygun bir \u00e7\u00f6z\u00fcm haline getirir. Basitli\u011fi, performans\u0131 ve <code>no_std<\/code> uyumlulu\u011fu, \u00f6zellikle kaynak k\u0131s\u0131tl\u0131 ortamlarda veya y\u00fcksek performansl\u0131 loglama gibi alanlarda parlamas\u0131n\u0131 sa\u011flar.<\/p>\n<p>A\u015fa\u011f\u0131daki tablo, Heave'in di\u011fer baz\u0131 depolama \u00e7\u00f6z\u00fcmleriyle temel \u00f6zellikler a\u00e7\u0131s\u0131ndan kar\u015f\u0131la\u015ft\u0131rmas\u0131n\u0131 sunmaktad\u0131r:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u00d6zellik<\/th>\n<th>Heave<\/th>\n<th>Sled (Anahtar-De\u011fer)<\/th>\n<th>SQLite (\u0130li\u015fkisel DB)<\/th>\n<th>D\u00fcz Dosya (Raw I\/O)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>API Basitli\u011fi<\/td>\n<td>\u00c7ok Basit (Append-only)<\/td>\n<td>Orta (CRUD, Anahtar-De\u011fer)<\/td>\n<td>Karma\u015f\u0131k (SQL, Schema)<\/td>\n<td>\u00c7ok Basit (Temel Okuma\/Yazma)<\/td>\n<\/tr>\n<tr>\n<td>Veri Modeli<\/td>\n<td>S\u0131ral\u0131 Kay\u0131t Ak\u0131\u015f\u0131 (<code>&[u8]<\/code>)<\/td>\n<td>Anahtar-De\u011fer<\/td>\n<td>Tablolar, \u0130li\u015fkiler<\/td>\n<td>Yap\u0131land\u0131r\u0131lmam\u0131\u015f<\/td>\n<\/tr>\n<tr>\n<td>Yazma Modeli<\/td>\n<td>Append-only (Sadece Ekleme)<\/td>\n<td>Rastgele Yazma<\/td>\n<td>Rastgele Yazma<\/td>\n<td>Ard\u0131\u015f\u0131k\/Rastgele<\/td>\n<\/tr>\n<tr>\n<td>Performans<\/td>\n<td>Y\u00fcksek (Ard\u0131\u015f\u0131k I\/O)<\/td>\n<td>\u00c7ok Y\u00fcksek<\/td>\n<td>Orta-Y\u00fcksek<\/td>\n<td>De\u011fi\u015fken<\/td>\n<\/tr>\n<tr>\n<td><code>no_std<\/code> Deste\u011fi<\/td>\n<td>Evet<\/td>\n<td>Hay\u0131r<\/td>\n<td>Hay\u0131r<\/td>\n<td>Evet (\u00c7ekirdek Deste\u011fiyle)<\/td>\n<\/tr>\n<tr>\n<td>ACID Garantileri<\/td>\n<td>K\u0131smi (Atomik Append)<\/td>\n<td>Evet<\/td>\n<td>Evet<\/td>\n<td>Hay\u0131r (Manuel)<\/td>\n<\/tr>\n<tr>\n<td>Veri Silme\/G\u00fcncelleme<\/td>\n<td>Dolayl\u0131 (Compaction\/\u0130\u015faretleme)<\/td>\n<td>Do\u011frudan<\/td>\n<td>Do\u011frudan<\/td>\n<td>Manuel<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Performans ve G\u00fcvenlik Odakl\u0131 Optimizasyonlar Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Heave, do\u011fas\u0131 gere\u011fi zaten performansa \u00f6nem veren bir k\u00fct\u00fcphanedir. Ancak her depolama \u00e7\u00f6z\u00fcm\u00fcnde oldu\u011fu gibi, Heave kullan\u0131m\u0131nda da belirli optimizasyon ve g\u00fcvenlik pratikleri, uygulaman\u0131z\u0131n daha verimli ve dayan\u0131kl\u0131 olmas\u0131n\u0131 sa\u011flayabilir. \u00d6zellikle IoT ve g\u00f6m\u00fcl\u00fc sistemler gibi kaynak k\u0131s\u0131tl\u0131 ortamlarda bu ipu\u00e7lar\u0131 kritik \u00f6neme sahiptir.<\/p>\n<h4>1. <code>sync_all<\/code> Kullan\u0131m\u0131 ve Ne Zaman Gerekli Oldu\u011fu<\/h4>\n<p>Veriler, i\u015fletim sistemi \u00f6nbelleklerinde (RAM) kalabilir ve hemen diske yaz\u0131lmayabilir. Bu durum, performans i\u00e7in iyi olsa da, bir sistem \u00e7\u00f6kmesi veya elektrik kesintisi durumunda veri kayb\u0131na yol a\u00e7abilir. <code>Heave::sync_all()<\/code> metodu, bekleyen t\u00fcm yazma i\u015flemlerinin fiziksel olarak diske senkronize edilmesini sa\u011flar. Bu, veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<ul>\n<li>\n        <strong>Ne Zaman Kullan\u0131lmal\u0131:<\/strong><\/p>\n<ul>\n<li>Kritik bir i\u015flem tamamland\u0131\u011f\u0131nda (\u00f6rne\u011fin, bir ayar kaydedildi\u011finde veya bir para transferi gibi \u00f6nemli bir olay logland\u0131\u011f\u0131nda).<\/li>\n<li>Uygulama d\u00fczg\u00fcn bir \u015fekilde kapat\u0131l\u0131rken.<\/li>\n<li>Belirli aral\u0131klarla (\u00f6rne\u011fin, her X saniyede bir veya her Y kay\u0131tta bir), performans ile veri kayb\u0131 riski aras\u0131nda bir denge kurmak i\u00e7in.<\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>Performans Etkisi:<\/strong> <code>sync_all()<\/code> \u00e7a\u011fr\u0131s\u0131, disk I\/O'su i\u00e7erdi\u011fi i\u00e7in performans\u0131 d\u00fc\u015f\u00fcrebilir. Her <code>append<\/code> i\u015fleminden sonra <code>sync_all()<\/code> \u00e7a\u011f\u0131rmak, \u00f6zellikle y\u00fcksek yazma h\u0131z\u0131 gerektiren uygulamalarda darbo\u011faz yaratabilir. Bu durumda, \u00e7a\u011fr\u0131y\u0131 daha seyrek yaparak (batching) performans\u0131 optimize edebilirsiniz.\n    <\/li>\n<\/ul>\n<pre><code>\n\/\/ Her 100 kay\u0131tta bir veya zaman bazl\u0131 senkronizasyon\nlet mut write_count = 0;\nfor data in large_dataset {\n    heave.append(&data)?;\n    write_count += 1;\n    if write_count % 100 == 0 {\n        heave.sync_all()?;\n        println!(\"{} kay\u0131t diske senkronize edildi.\", write_count);\n    }\n}\nheave.sync_all()?; \/\/ Kalan kay\u0131tlar\u0131 da senkronize et\n<\/pre>\n<p><\/code><\/p>\n<h4>2. Veri S\u0131k\u0131\u015ft\u0131rma<\/h4>\n<p>Heave do\u011frudan veri s\u0131k\u0131\u015ft\u0131rma \u00f6zelli\u011fi sunmaz. Ancak, diske yazmadan \u00f6nce verilerinizi kendiniz s\u0131k\u0131\u015ft\u0131rabilirsiniz. Bu, \u00f6zellikle b\u00fcy\u00fck ve tekrarlayan veri setlerinde (\u00f6rne\u011fin, sens\u00f6r verileri) depolama alan\u0131ndan tasarruf etmenizi ve I\/O miktar\u0131n\u0131 azaltarak performans\u0131 art\u0131rman\u0131z\u0131 sa\u011flar.<\/p>\n<ul>\n<li>\n        <strong>Nas\u0131l Yap\u0131l\u0131r:<\/strong> <code>serde<\/code> ile serile\u015ftirdikten sonra, <code>flate2<\/code> (gzip, deflate), <code>lz4<\/code> veya <code>zstd<\/code> gibi Rust k\u00fct\u00fcphaneleri kullanarak <code>&[u8]<\/code> dilimini s\u0131k\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<pre><code>\nuse flate2::{write::GzEncoder, read::GzDecoder, Compression};\nuse std::io::{Write, Read};\n\n\/\/ ...\nlet serialized_data = serde_json::to_vec(&data)?;\nlet mut encoder = GzEncoder::new(Vec::new(), Compression::fast());\nencoder.write_all(&serialized_data)?;\nlet compressed_data = encoder.finish()?;\n\nheave.append(&compressed_data)?;\nheave.sync_all()?; \/\/ veya belirli aral\u0131klarla\n\n\/\/ Okurken\nlet mut decoder = GzDecoder::new(Cursor::new(record));\nlet mut decompressed_data = Vec::new();\ndecoder.read_to_end(&mut decompressed_data)?;\nlet deserialized_data: MyData = serde_json::from_slice(&decompressed_data)?;\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Denge:<\/strong> S\u0131k\u0131\u015ft\u0131rma ve a\u00e7ma i\u015flemleri CPU y\u00fck\u00fc getirir. Depolama alan\u0131 ve I\/O kazanc\u0131yla CPU t\u00fcketimi aras\u0131nda bir denge kurman\u0131z gerekir.\n    <\/li>\n<\/ul>\n<h4>3. Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc ve Checksumlar<\/h4>\n<p>Disk bozulmalar\u0131 veya yazma hatalar\u0131, depolanan verilerin b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc tehlikeye atabilir. Heave, <code>&[u8]<\/code> dilimleri olarak veri saklad\u0131\u011f\u0131 i\u00e7in, bu dilimlerin b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc kontrol etmek sizin sorumlulu\u011funuzdad\u0131r. Her kayda bir checksum (sa\u011flama toplam\u0131) eklemek, okuma s\u0131ras\u0131nda verinin bozulup bozulmad\u0131\u011f\u0131n\u0131 kontrol etmenizi sa\u011flar.<\/p>\n<ul>\n<li>\n        <strong>Nas\u0131l Yap\u0131l\u0131r:<\/strong> Kayd\u0131 serile\u015ftirdikten sonra (veya s\u0131k\u0131\u015ft\u0131rd\u0131ktan sonra), <code>crc32fast<\/code> gibi bir k\u00fct\u00fcphane kullanarak verinin checksum'\u0131n\u0131 hesaplay\u0131n ve bu checksum'\u0131 verinin bir par\u00e7as\u0131 olarak (veya ayr\u0131 bir Heave kayd\u0131 olarak) saklay\u0131n. Okurken, kaydedilen checksum ile okunan verinin checksum'\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131n.\n    <\/li>\n<\/ul>\n<h4>4. <code>no_std<\/code> Deste\u011fi ve G\u00f6m\u00fcl\u00fc Sistemlerde Kullan\u0131m\u0131<\/h4>\n<p>Heave'in <code>no_std<\/code> deste\u011fi, onu mikrodenetleyiciler gibi standart k\u00fct\u00fcphanenin bulunmad\u0131\u011f\u0131 veya s\u0131n\u0131rl\u0131 oldu\u011fu g\u00f6m\u00fcl\u00fc sistemler i\u00e7in e\u015fsiz k\u0131lar. Bu ortamlarda, <code>std<\/code> yerine <code>core<\/code> ve <code>alloc<\/code> k\u00fct\u00fcphanelerinin sundu\u011fu s\u0131n\u0131rl\u0131 kaynaklarla \u00e7al\u0131\u015f\u0131l\u0131r.<\/p>\n<ul>\n<li>\n        <strong>Kullan\u0131m:<\/strong> <code>Cargo.toml<\/code> dosyan\u0131zda varsay\u0131lan <code>std<\/code> \u00f6zelli\u011fini kapatman\u0131z ve <code>no_std<\/code> \u00f6zelli\u011fini etkinle\u015ftirmeniz gerekebilir.<\/p>\n<pre><code>\n[dependencies]\nheave = { version = \"0.1.0\", default-features = false, features = [\"no_std\"] }\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Mobil Uyumluluk Kavram\u0131:<\/strong> Do\u011frudan <code>no_std<\/code> ile mobil uygulama geli\u015ftirmek yayg\u0131n olmasa da, mobil cihazlar\u0131n alt\u0131ndaki flash depolama donan\u0131mlar\u0131 veya SD kartlar, Heave'in ard\u0131\u015f\u0131k yazma performans\u0131ndan faydalanabilir. Mobil uygulamalar genellikle daha y\u00fcksek seviye depolama API'leri (CoreData, Room, SQLite) kullansa da, e\u011fer bir mobil uygulama i\u00e7erisinde h\u0131zl\u0131, yerel bir loglama veya olay kuyru\u011fu ihtiyac\u0131 varsa, <code>no_std<\/code> bir Heave benzeri yap\u0131 (belki bir C ba\u011flay\u0131c\u0131 ile) d\u00fc\u015f\u00fcn\u00fclebilir. Mobil uyumlu HTML ba\u011flam\u0131nda ise, Heave'in \u00fcretti\u011fi verinin g\u00f6sterilece\u011fi aray\u00fcz\u00fcn mobil cihazlarda d\u00fczg\u00fcn g\u00f6r\u00fcnmesi i\u00e7in CSS media query'ler (\u00f6rne\u011fin, k\u00fc\u00e7\u00fck ekranlarda <code>pre<\/code> etiketleri i\u00e7in <code>overflow-x: auto;<\/code>) kullan\u0131lmas\u0131 gerekti\u011fini belirtmek \u00f6nemlidir. Ancak bu makale HTML \u00e7\u0131kt\u0131s\u0131 verdi\u011fi i\u00e7in CSS kodlar\u0131 bu kapsamda de\u011fildir.\n    <\/li>\n<\/ul>\n<p class=\"expert-tip\">Uzman \u0130pucu: Bellek ve I\/O performans\u0131n\u0131 optimize etmek i\u00e7in, b\u00fcy\u00fck veri bloklar\u0131n\u0131 tek seferde <code>append<\/code> etmek yerine, Heave'in dahili buffer boyutuna uygun par\u00e7alara b\u00f6lmek veya veri yazmadan \u00f6nce disk blo\u011fu hizalamas\u0131na dikkat etmek (e\u011fer m\u00fcmk\u00fcnse) faydal\u0131 olabilir. Ancak Heave k\u00fct\u00fcphanesi bu detaylar\u0131 sizin i\u00e7in zaten halletmeye \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>Bu optimizasyonlar ve g\u00fcvenlik \u00f6nlemleri, Heave tabanl\u0131 uygulaman\u0131z\u0131n daha sa\u011flam, h\u0131zl\u0131 ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar. \u0130htiya\u00e7lar\u0131n\u0131za g\u00f6re bu teknikleri birle\u015ftirebilir veya ayarlayabilirsiniz.<\/p>\n<h2>\u0130leri D\u00fczey Kullan\u0131m \u0130pu\u00e7lar\u0131 ve En \u0130yi Pratikler<\/h2>\n<p>Heave'in temel kullan\u0131m\u0131 basit olsa da, daha b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda onu daha verimli ve y\u00f6netilebilir k\u0131lmak i\u00e7in baz\u0131 ileri d\u00fczey teknikler ve en iyi pratikler mevcuttur. Bu ipu\u00e7lar\u0131, \u00f6zellikle uzun \u00f6m\u00fcrl\u00fc ve y\u00fcksek performansl\u0131 sistemler geli\u015ftirirken size yol g\u00f6sterecektir.<\/p>\n<h4>1. Asenkron \u0130\u015flemler ve <code>tokio<\/code> ile Entegrasyon<\/h4>\n<p>Heave k\u00fct\u00fcphanesi, standart <code>std::io<\/code> aray\u00fcz\u00fcn\u00fc kulland\u0131\u011f\u0131 i\u00e7in varsay\u0131lan olarak senkrondur. Ancak, uzun s\u00fcreli disk I\/O operasyonlar\u0131n\u0131n uygulaman\u0131z\u0131n ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 (thread) bloklamas\u0131n\u0131 \u00f6nlemek i\u00e7in asenkron bir \u00e7al\u0131\u015fma zaman\u0131 (runtime) olan <code>tokio<\/code> ile entegre edebilirsiniz. Bu, \u00f6zellikle web sunucular\u0131 veya a\u011f servisleri gibi e\u015f zamanl\u0131 i\u015flem gerektiren uygulamalarda \u00f6nemlidir.<\/p>\n<ul>\n<li>\n        <strong>Nas\u0131l Yap\u0131l\u0131r:<\/strong> <code>tokio<\/code>'nun <code>spawn_blocking<\/code> fonksiyonunu kullanarak Heave i\u015flemlerini ayr\u0131 bir bloklama i\u015f par\u00e7ac\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131rabilirsiniz. Bu, ana asenkron i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131z\u0131n bloklanmadan di\u011fer g\u00f6revleri yerine getirmesine olanak tan\u0131r.<\/p>\n<pre><code>\nuse tokio::fs::OpenOptions; \/\/ Heave i\u00e7in <code>std::fs::File<\/code> yerine\nuse heave::{Heave, Options};\nuse std::path::PathBuf;\nuse std::io;\n\n#[tokio::main]\nasync fn main() -> io::Result<()> {\n    let path = PathBuf::from(\"async_heave_data.bin\");\n\n    \/\/ Heave'i async bir \u015fekilde a\u00e7ma veya olu\u015fturma\n    \/\/ Heave'in kendisi senkron bir API'ye sahip oldu\u011fundan,\n    \/\/ onu tokio'nun spawn_blocking'i i\u00e7inde \u00e7al\u0131\u015ft\u0131rmam\u0131z gerekir.\n    let mut heave = tokio::task::spawn_blocking(move || {\n        Heave::open(&path, Options::new().create(true))\n    }).await??;\n\n    let data = b\"Asenkron olarak yaz\u0131lan veri.\";\n    \n    \/\/ Veri yazma i\u015flemini de spawn_blocking i\u00e7inde yapal\u0131m\n    tokio::task::spawn_blocking(move || {\n        heave.append(data)?;\n        heave.sync_all()?;\n        Ok(()) as io::Result<()>\n    }).await??;\n\n    println!(\"Asenkron veri yaz\u0131ld\u0131 ve senkronize edildi.\");\n\n    \/\/ Veri okuma da benzer \u015fekilde yap\u0131labilir\n    let mut reader = tokio::task::spawn_blocking(move || {\n        heave.reader()\n    }).await??;\n\n    tokio::task::spawn_blocking(move || {\n        while let Some(record) = reader.read_record().unwrap() {\n            println!(\"Asenkron okunan: {}\", String::from_utf8_lossy(record));\n        }\n        Ok(()) as io::Result<()>\n    }).await??;\n\n    Ok(())\n}\n        <\/pre>\n<p><\/code><br \/>\n        Bu \u00f6rnekte, Heave'in senkron API'si, <code>tokio::task::spawn_blocking<\/code> i\u00e7inde ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r, bu da ana <code>async<\/code> ba\u011flam\u0131n\u0131n bloklanmamas\u0131n\u0131 sa\u011flar.\n    <\/li>\n<\/ul>\n<h4>2. Birden Fazla Heave Dosyas\u0131 Y\u00f6netimi (Sharding)<\/h4>\n<p>Tek bir Heave dosyas\u0131 \u00e7ok b\u00fcy\u00fcd\u00fc\u011f\u00fcnde veya farkl\u0131 veri t\u00fcrlerini ayr\u0131 ayr\u0131 y\u00f6netmek istedi\u011finizde, birden fazla Heave dosyas\u0131 kullanmak mant\u0131kl\u0131 olabilir (sharding veya partitioning). \u00d6rne\u011fin, ayl\u0131k loglar\u0131 farkl\u0131 dosyalara kaydedebilirsiniz: <code>logs_2023_01.heave<\/code>, <code>logs_2023_02.heave<\/code> gibi.<\/p>\n<ul>\n<li>\n        <strong>Avantajlar\u0131:<\/strong><\/p>\n<ul>\n<li>Daha kolay bak\u0131m ve ar\u015fivleme: Eski log dosyalar\u0131n\u0131 kolayca silebilir veya ar\u015fivleyebilirsiniz.<\/li>\n<li>Okuma performans\u0131: Belirli bir zaman aral\u0131\u011f\u0131ndaki verilere eri\u015fmek, sadece ilgili Heave dosyas\u0131n\u0131 a\u00e7arak daha h\u0131zl\u0131 olabilir.<\/li>\n<li>Depolama alan\u0131 y\u00f6netimi: Her bir dosyan\u0131n boyutunu izlemek ve y\u00f6netmek daha kolayd\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>Uygulama:<\/strong> Uygulaman\u0131zda, hangi Heave dosyas\u0131na yaz\u0131laca\u011f\u0131n\u0131 veya hangi dosyalardan okunaca\u011f\u0131n\u0131 belirleyen bir y\u00f6nlendirme mant\u0131\u011f\u0131 (routing logic) olu\u015fturman\u0131z gerekir. Bu, genellikle tarih, veri t\u00fcr\u00fc veya di\u011fer meta verilere g\u00f6re yap\u0131l\u0131r.\n    <\/li>\n<\/ul>\n<h4>3. Hata Durumlar\u0131nda Veri Kurtarma Stratejileri<\/h4>\n<p>Heave, append-only yap\u0131s\u0131 sayesinde veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumada olduk\u00e7a ba\u015far\u0131l\u0131d\u0131r. Ancak, bir yazma i\u015flemi s\u0131ras\u0131nda elektrik kesintisi gibi ani bir sorun ya\u015fan\u0131rsa, son yaz\u0131lan kay\u0131t k\u0131smen bozulabilir. Heave bu durumu kendili\u011finden tespit edip son bozuk kayd\u0131 g\u00f6z ard\u0131 etmeye \u00e7al\u0131\u015f\u0131r.<\/p>\n<ul>\n<li>\n        <strong>\u00d6nlemler:<\/strong><\/p>\n<ul>\n<li>Her kayda bir checksum eklemek, bozuk kay\u0131tlar\u0131 daha g\u00fcvenilir bir \u015fekilde tespit etmenizi sa\u011flar.<\/li>\n<li>Kay\u0131tlar\u0131 yazarken her kayd\u0131n uzunlu\u011funu ve integrity check'ini i\u00e7eren k\u00fc\u00e7\u00fck bir \"header\" ekleyebilirsiniz.<\/li>\n<li>Kritik uygulamalarda, ikincil bir Heave dosyas\u0131na veya farkl\u0131 bir depolama birimine yedekleme yapmak, veri kayb\u0131 riskini minimize eder.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>4. Test Edilebilir Kod Yazma<\/h4>\n<p>Heave ile \u00e7al\u0131\u015fan kodunuzu test etmek, uygulaman\u0131z\u0131n g\u00fcvenilirli\u011fini sa\u011flamak i\u00e7in \u00f6nemlidir. Testlerinizde ger\u00e7ek dosya sistemiyle etkile\u015fimi sim\u00fcle etmek veya ge\u00e7ici dosyalar kullanmak en iyi yakla\u015f\u0131md\u0131r.<\/p>\n<ul>\n<li>\n        <strong>Ge\u00e7ici Dizin Kullan\u0131m\u0131:<\/strong> <code>tempfile<\/code> veya <code>tempdir<\/code> gibi k\u00fct\u00fcphaneler, testler i\u00e7in ge\u00e7ici dosyalar ve dizinler olu\u015fturman\u0131z\u0131 sa\u011flar. Test bitti\u011finde bu kaynaklar otomatik olarak temizlenir.<\/p>\n<pre><code>\n#[test]\nfn test_heave_write_read() -> io::Result<()> {\n    let temp_dir = tempfile::tempdir()?;\n    let path = temp_dir.path().join(\"test.heave\");\n\n    let mut heave = Heave::open(&path, Options::new().create(true))?;\n    heave.append(b\"Test verisi 1\")?;\n    heave.append(b\"Test verisi 2\")?;\n    heave.sync_all()?;\n\n    let mut reader = heave.reader()?;\n    assert_eq!(reader.read_record()?, Some(b\"Test verisi 1\".as_ref()));\n    assert_eq!(reader.read_record()?, Some(b\"Test verisi 2\".as_ref()));\n    assert_eq!(reader.read_record()?, None); \/\/ Ba\u015fka kay\u0131t kalmamal\u0131\n\n    Ok(())\n}\n        <\/pre>\n<p><\/code>\n    <\/li>\n<\/ul>\n<h4>5. Loglama ve \u0130zleme<\/h4>\n<p>Heave dosyalar\u0131n\u0131n b\u00fcy\u00fckl\u00fc\u011f\u00fc, yazma\/okuma h\u0131zlar\u0131 ve olas\u0131 hatalar\u0131 izlemek, uygulaman\u0131z\u0131n sa\u011fl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan \u00f6nemlidir. <code>log<\/code> veya <code>tracing<\/code> gibi k\u00fct\u00fcphanelerle Heave i\u015flemlerini detayl\u0131 bir \u015fekilde loglayabilirsiniz.<\/p>\n<p class=\"expert-tip\">Uzman \u0130pucu: Heave'i bir FIFO (First-In, First-Out) kuyru\u011fu gibi kullanabilirsiniz. \u0130\u015flenen verileri diske kaydetmek i\u00e7in <code>heave.append()<\/code> kullan\u0131rken, okunacak verileri i\u015faretlemek veya farkl\u0131 bir Heave dosyas\u0131na ta\u015f\u0131mak i\u00e7in \u00f6zel bir mekanizma geli\u015ftirmeniz gerekebilir. Bu t\u00fcr bir FIFO davran\u0131\u015f\u0131 i\u00e7in, okunan kay\u0131tlar\u0131n konumunu (offset) harici bir dosyada tutmak ve belirli bir e\u015fi\u011fe ula\u015f\u0131ld\u0131\u011f\u0131nda bir \"compaction\" i\u015flemiyle eski kay\u0131tlar\u0131 temizlemek yayg\u0131n bir yakla\u015f\u0131md\u0131r.<\/p>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi pratikler, Heave'i sadece bir veri depolama arac\u0131 olmaktan \u00e7\u0131kar\u0131p, uygulaman\u0131z\u0131n temel bir bile\u015feni haline getirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2>Sonu\u00e7 ve Gelecek Perspektifleri<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, Rust'ta veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flaman\u0131n neden bu kadar \u00f6nemli oldu\u011funu, Heave k\u00fct\u00fcphanesinin ne oldu\u011funu ve Rust ekosistemindeki benzersiz yerini derinlemesine inceledik. Heave'in basit, disk tabanl\u0131 ve append-only (sadece eklemeli) yap\u0131s\u0131n\u0131n, \u00f6zellikle kaynak k\u0131s\u0131tl\u0131 ortamlar ve y\u00fcksek performansl\u0131 g\u00fcnl\u00fckleme (logging) gibi belirli senaryolarda nas\u0131l g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sundu\u011funu g\u00f6rd\u00fck.<\/p>\n<p>Heave'in ba\u015fl\u0131ca g\u00fc\u00e7l\u00fc y\u00f6nleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Basitlik:<\/strong> Geleneksel veritabanlar\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131ndan uzak, kullan\u0131m\u0131 kolay bir API sunar.<\/li>\n<li><strong>Performans:<\/strong> Ard\u0131\u015f\u0131k disk I\/O'su sayesinde y\u00fcksek yazma h\u0131zlar\u0131na ula\u015f\u0131r.<\/li>\n<li><strong>Dayan\u0131kl\u0131l\u0131k:<\/strong> Append-only do\u011fas\u0131, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc art\u0131r\u0131r ve kurtarma i\u015flemlerini basitle\u015ftirir.<\/li>\n<li><strong><code>no_std<\/code> Deste\u011fi:<\/strong> G\u00f6m\u00fcl\u00fc sistemler ve mikrodenetleyiciler i\u00e7in ideal bir se\u00e7enektir.<\/li>\n<li><strong>Esneklik:<\/strong> Veri serile\u015ftirme format\u0131n\u0131 se\u00e7me \u00f6zg\u00fcrl\u00fc\u011f\u00fc sunar.<\/li>\n<\/ul>\n<p>Ancak, her ara\u00e7 gibi Heave'in de belirli s\u0131n\u0131rlamalar\u0131 vard\u0131r:<\/p>\n<ul>\n<li><strong>Do\u011frudan G\u00fcncelleme\/Silme Yok:<\/strong> Append-only yap\u0131s\u0131, kay\u0131tlar\u0131n do\u011frudan g\u00fcncellenmesini veya silinmesini engeller; bu i\u015flemler dolayl\u0131 yollarla (mant\u0131ksal silme, compaction) yap\u0131lmal\u0131d\u0131r.<\/li>\n<li><strong>Karma\u015f\u0131k Sorgulama Yok:<\/strong> Tam te\u015fekk\u00fcll\u00fc bir veritaban\u0131 gibi karma\u015f\u0131k sorgu dilleri veya indeksleme yetenekleri sunmaz. Veriler genellikle s\u0131rayla okunur.<\/li>\n<\/ul>\n<p>Heave, bu g\u00fc\u00e7l\u00fc ve zay\u0131f y\u00f6nleriyle, do\u011fru senaryoda kullan\u0131ld\u0131\u011f\u0131nda paha bi\u00e7ilmez bir ara\u00e7t\u0131r. \u00d6zellikle:<\/p>\n<ul>\n<li>IoT cihazlar\u0131nda sens\u00f6r verisi depolama.<\/li>\n<li>Y\u00fcksek h\u0131zl\u0131 loglama ve olay ak\u0131\u015f\u0131 kay\u0131t sistemleri.<\/li>\n<li>Ge\u00e7ici veya kal\u0131c\u0131 \u00f6nbellekler.<\/li>\n<li><code>no_std<\/code> uyumlulu\u011fu gerektiren projeler.<\/li>\n<\/ul>\n<p>gibi alanlarda \u00f6ne \u00e7\u0131kar. E\u011fer uygulaman\u0131z\u0131n ana ihtiyac\u0131 h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde veri eklemek ve s\u0131rayla okumaksa, Heave kesinlikle de\u011ferlendirilmesi gereken bir se\u00e7enektir.<\/p>\n<p>Rust'ta veri kal\u0131c\u0131l\u0131\u011f\u0131n\u0131n gelece\u011fi, Heave gibi hafif ve \u00f6zel ama\u00e7l\u0131 k\u00fct\u00fcphanelerle birlikte Sled gibi daha genel ama\u00e7l\u0131 anahtar-de\u011fer depolar\u0131 ve daha geleneksel veritaban\u0131 ba\u011flay\u0131c\u0131lar\u0131n\u0131n da geli\u015fimiyle \u015fekillenecektir. Geli\u015ftiricilerin ihtiya\u00e7lar\u0131na g\u00f6re do\u011fru arac\u0131 se\u00e7ebilecekleri zengin bir ekosistem olu\u015fmaktad\u0131r. Heave, bu ekosistemde \"az ama \u00f6z\" felsefesiyle yerini sa\u011flamla\u015ft\u0131rm\u0131\u015ft\u0131r ve veri kal\u0131c\u0131l\u0131\u011f\u0131na odaklanan bir\u00e7ok Rust projesi i\u00e7in de\u011ferli bir bile\u015fen olmaya devam edecektir.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<h3>Heave bir veritaban\u0131 m\u0131d\u0131r?<\/h3>\n<p>Hay\u0131r, Heave tam te\u015fekk\u00fcll\u00fc bir veritaban\u0131 de\u011fildir. \u0130li\u015fkisel veritabanlar\u0131n\u0131n (SQL) veya bir\u00e7ok NoSQL veritaban\u0131n\u0131n sundu\u011fu geli\u015fmi\u015f sorgulama dilleri, indeksleme, i\u015flem (transaction) y\u00f6netimi veya a\u011f \u00fczerinden eri\u015fim gibi \u00f6zelliklere sahip de\u011fildir. Heave, disk \u00fczerinde basit, append-only bir veri depolama katman\u0131 sa\u011flayan daha d\u00fc\u015f\u00fck seviyeli bir k\u00fct\u00fcphanedir. Genellikle loglama, olay kaynaklama veya basit s\u0131ral\u0131 veri saklama gibi belirli senaryolar i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Heave b\u00fcy\u00fck veri setleri i\u00e7in uygun mudur?<\/h3>\n<p>Evet, Heave b\u00fcy\u00fck veri setleri i\u00e7in olduk\u00e7a uygun olabilir, \u00f6zellikle verilerin s\u00fcrekli eklendi\u011fi (append-only) ve genellikle ba\u015ftan sona s\u0131rayla okundu\u011fu durumlarda. Append-only yap\u0131s\u0131, diske ard\u0131\u015f\u0131k yazma i\u015flemleri sa\u011flayarak b\u00fcy\u00fck veri hacimlerinde bile y\u00fcksek performans sunar. Ancak, b\u00fcy\u00fck veri setlerinde rastgele okuma veya karma\u015f\u0131k sorgulama ihtiya\u00e7lar\u0131n\u0131z varsa, Heave do\u011frudan bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamayabilir ve harici bir indeksleme veya daha geli\u015fmi\u015f bir veritaban\u0131 \u00e7\u00f6z\u00fcm\u00fcne y\u00f6nelmeniz gerekebilir.<\/p>\n<h3>Heave <code>no_std<\/code> ortamlar\u0131nda kullan\u0131labilir mi?<\/h3>\n<p>Kesinlikle evet. Heave, <code>no_std<\/code> \u00f6zelli\u011fi sayesinde standart Rust k\u00fct\u00fcphanesine (std) ba\u011f\u0131ml\u0131 olmadan derlenebilir ve \u00e7al\u0131\u015fabilir. Bu \u00f6zellik, onu bellek ve i\u015flemci k\u0131s\u0131tlamalar\u0131 olan mikrodenetleyiciler ve di\u011fer g\u00f6m\u00fcl\u00fc sistemler i\u00e7in \u00e7ok cazip bir se\u00e7enek haline getirir. <code>no_std<\/code> ortamlar\u0131nda dosya sistemi eri\u015fimi i\u00e7in platforma \u00f6zg\u00fc bir implementasyon sa\u011flaman\u0131z gerekebilir, ancak Heave'in \u00e7ekirdek mant\u0131\u011f\u0131 bu ortamlarda sorunsuz \u00e7al\u0131\u015f\u0131r.<\/p>\n<h3>Heave'de veri silme veya g\u00fcncelleme nas\u0131l yap\u0131l\u0131r?<\/h3>\n<p>Heave, append-only bir yap\u0131ya sahip oldu\u011fu i\u00e7in kay\u0131tlar\u0131n do\u011frudan silinmesi veya g\u00fcncellenmesi m\u00fcmk\u00fcn de\u011fildir. Bu i\u015flemler dolayl\u0131 yollarla ger\u00e7ekle\u015ftirilir:<\/p>\n<ol>\n<li><strong>Mant\u0131ksal Silme\/G\u00fcncelleme:<\/strong> Yeni bir kay\u0131t ekleyerek eski kayd\u0131 \"ge\u00e7ersiz\" veya \"g\u00fcncel olmayan\" olarak i\u015faretleyebilirsiniz. Okuma s\u0131ras\u0131nda, verinin en son s\u00fcr\u00fcm\u00fcn\u00fc veya silinmemi\u015f kay\u0131tlar\u0131 filtrelemeniz gerekir.<\/li>\n<li><strong>Compaction (S\u0131k\u0131\u015ft\u0131rma\/Yeniden Yazma):<\/strong> Belirli aral\u0131klarla (\u00f6rne\u011fin dosya boyutu belirli bir e\u015fi\u011fe ula\u015ft\u0131\u011f\u0131nda), yeni bir Heave dosyas\u0131 olu\u015fturursunuz. Eski dosyay\u0131 ba\u015ftan sona okuyarak, sadece ge\u00e7erli, g\u00fcncel ve silinmemi\u015f kay\u0131tlar\u0131 yeni dosyaya yazars\u0131n\u0131z. \u0130\u015flem tamamland\u0131\u011f\u0131nda, eski dosyay\u0131 silebilirsiniz. Bu i\u015flem veritabanlar\u0131ndaki \u00e7\u00f6p toplama (garbage collection) i\u015flemine benzer.<\/li>\n<\/ol>\n<h3>Heave kullan\u0131rken hangi durumlarda dikkatli olmal\u0131y\u0131m?<\/h3>\n<p>Heave kullan\u0131rken dikkat etmeniz gereken baz\u0131 durumlar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Rastgele Eri\u015fim ve Sorgulama:<\/strong> E\u011fer s\u0131k s\u0131k belirli bir kayda rastgele eri\u015fim sa\u011flaman\u0131z veya karma\u015f\u0131k ko\u015fullara dayal\u0131 sorgular yapman\u0131z gerekiyorsa, Heave bu durumlar i\u00e7in optimize edilmemi\u015ftir. Daha \u00e7ok s\u0131ral\u0131 okuma ve yazma i\u015flemlerinde ba\u015far\u0131l\u0131d\u0131r.<\/li>\n<li><strong>E\u015f Zamanl\u0131 Yazma:<\/strong> Birden fazla i\u015flem veya i\u015f par\u00e7ac\u0131\u011f\u0131 ayn\u0131 Heave dosyas\u0131na ayn\u0131 anda yazmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, kilitleme mekanizmalar\u0131n\u0131 kendiniz y\u00f6netmeniz gerekebilir (Heave'in kendisi tek bir writer'\u0131 destekler).<\/li>\n<li><strong>Disk Alan\u0131 Y\u00f6netimi:<\/strong> Append-only oldu\u011fu i\u00e7in dosya boyutu s\u00fcrekli artar. Bu durumu d\u00fczenli compaction i\u015flemleriyle veya eski dosyalar\u0131 ar\u015fivleyerek\/silerek y\u00f6netmeniz \u00f6nemlidir.<\/li>\n<li><strong>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc:<\/strong> <code>sync_all()<\/code> \u00e7a\u011fr\u0131lar\u0131n\u0131 ne zaman yapaca\u011f\u0131n\u0131za iyi karar vermelisiniz. Performans ve veri kayb\u0131 riski aras\u0131nda bir denge kurmak \u00f6nemlidir.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"Rust projelerinizde veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in etkili bir \u00e7\u00f6z\u00fcm m\u00fc ar\u0131yorsunuz? Bu kapsaml\u0131 rehberde, disk tabanl\u0131 depolama i\u00e7in&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-30934","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi<\/title>\n<meta name=\"description\" content=\"Rust projelerinizde veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in etkili bir \u00e7\u00f6z\u00fcm m\u00fc ar\u0131yorsunuz? Bu kapsaml\u0131 rehberde, disk tabanl\u0131 depolama i\u00e7in Heave k\u00fct\u00fcphanesini kullanarak verileri g\u00fcvenli ve performansl\u0131 bir \u015fekilde nas\u0131l saklayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedeceksiniz. D\u00fc\u015f\u00fck seviye kontrol ve y\u00fcksek performans\u0131n birle\u015fti\u011fi Heave ile veri y\u00f6netimi art\u0131k \u00e7ok daha kolay.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi\" \/>\n<meta property=\"og:description\" content=\"Rust projelerinizde veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in etkili bir \u00e7\u00f6z\u00fcm m\u00fc ar\u0131yorsunuz? Bu kapsaml\u0131 rehberde, disk tabanl\u0131 depolama i\u00e7in Heave k\u00fct\u00fcphanesini kullanarak verileri g\u00fcvenli ve performansl\u0131 bir \u015fekilde nas\u0131l saklayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedeceksiniz. D\u00fc\u015f\u00fck seviye kontrol ve y\u00fcksek performans\u0131n birle\u015fti\u011fi Heave ile veri y\u00f6netimi art\u0131k \u00e7ok daha kolay.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-03T13:32:23+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"34 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi\",\"datePublished\":\"2025-10-03T13:32:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/\"},\"wordCount\":5555,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/\",\"name\":\"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-03T13:32:23+00:00\",\"description\":\"Rust projelerinizde veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in etkili bir \u00e7\u00f6z\u00fcm m\u00fc ar\u0131yorsunuz? Bu kapsaml\u0131 rehberde, disk tabanl\u0131 depolama i\u00e7in Heave k\u00fct\u00fcphanesini kullanarak verileri g\u00fcvenli ve performansl\u0131 bir \u015fekilde nas\u0131l saklayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedeceksiniz. D\u00fc\u015f\u00fck seviye kontrol ve y\u00fcksek performans\u0131n birle\u015fti\u011fi Heave ile veri y\u00f6netimi art\u0131k \u00e7ok daha kolay.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi","description":"Rust projelerinizde veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in etkili bir \u00e7\u00f6z\u00fcm m\u00fc ar\u0131yorsunuz? Bu kapsaml\u0131 rehberde, disk tabanl\u0131 depolama i\u00e7in Heave k\u00fct\u00fcphanesini kullanarak verileri g\u00fcvenli ve performansl\u0131 bir \u015fekilde nas\u0131l saklayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedeceksiniz. D\u00fc\u015f\u00fck seviye kontrol ve y\u00fcksek performans\u0131n birle\u015fti\u011fi Heave ile veri y\u00f6netimi art\u0131k \u00e7ok daha kolay.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi","og_description":"Rust projelerinizde veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in etkili bir \u00e7\u00f6z\u00fcm m\u00fc ar\u0131yorsunuz? Bu kapsaml\u0131 rehberde, disk tabanl\u0131 depolama i\u00e7in Heave k\u00fct\u00fcphanesini kullanarak verileri g\u00fcvenli ve performansl\u0131 bir \u015fekilde nas\u0131l saklayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedeceksiniz. D\u00fc\u015f\u00fck seviye kontrol ve y\u00fcksek performans\u0131n birle\u015fti\u011fi Heave ile veri y\u00f6netimi art\u0131k \u00e7ok daha kolay.","og_url":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-03T13:32:23+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"34 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi","datePublished":"2025-10-03T13:32:23+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/"},"wordCount":5555,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/","name":"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-03T13:32:23+00:00","description":"Rust projelerinizde veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in etkili bir \u00e7\u00f6z\u00fcm m\u00fc ar\u0131yorsunuz? Bu kapsaml\u0131 rehberde, disk tabanl\u0131 depolama i\u00e7in Heave k\u00fct\u00fcphanesini kullanarak verileri g\u00fcvenli ve performansl\u0131 bir \u015fekilde nas\u0131l saklayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedeceksiniz. D\u00fc\u015f\u00fck seviye kontrol ve y\u00fcksek performans\u0131n birle\u015fti\u011fi Heave ile veri y\u00f6netimi art\u0131k \u00e7ok daha kolay.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/rust-ile-veri-kaliciligi-heave-kutuphanesi-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Rust ile Veri Kal\u0131c\u0131l\u0131\u011f\u0131: Heave K\u00fct\u00fcphanesi Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30934","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=30934"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30934\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}