首頁 資料庫 mysql教程 每天进步一点点leveldb项目实践

每天进步一点点leveldb项目实践

Jun 07, 2016 pm 03:28 PM
leveldb 實踐 說明 進步 專案

转载请说明出处:http://blog.csdn.net/cywosp/article/details/20746879 leveldb是Google公司开源的高性能Key-Value数据库,在很多开源的项目中就有使用,例如:Chromium,淘宝的Tair,SSDB等。leveldb对于小数据在写入百万个之后读写性能依旧强劲,高效,因

转载请说明出处:http://blog.csdn.net/cywosp/article/details/20746879
leveldb是Google公司开源的高性能Key-Value数据库,在很多开源的项目中就有使用,例如:Chromium,淘宝的Tair,SSDB等。leveldb对于小数据在写入百万个之后读写性能依旧强劲,高效,因此非常适合用于存储小文件,以及一些需要持久化的索引和需要持久化的异步任务。
接触leveldb已经有一段时间了,当初为了找到一款轻量,高性能的数据库用于存储分布式文件系统中的任务,以便于在程序因为未知Bug而崩溃时能保存未完成的异步操作任务,我们网上搜索资料并比较了多个开源数据库,例如:Mysql、Sqlite、leveldb等等,综合各方面,最终选择了leveldb,其key具有排序功能,以及高效的性能非常符合我们的要求(Mysql对于存储本地进程中的任务太过于笨重了,而Sqlite在数据量大情况下性能会有比较明显的变化)。在我们的分布式文件系统中,我们对无需全局共享异步操作任务都使用了leveldb做持久化,在程序重启后重新加载leveldb中的数据,恢复崩溃之前的状态,继续自动执行未完成的任务。我们的大概做法是:为每一个任务分配一个唯一的Key,因为所有的任务都是具有先后执行顺序的,为了能够重启之后,任务的顺序能先前的一样,我们充分利用了leveldb根据字符比较来排序Key的特性,为任务从零开始分配Key的初始值,然后在所分配到的整数前以补0的方式格式化出一个21位的字符串类型的Key值(为什么是21位呢?因为在64位的操作系统中,一个无符号长整数的最大值有20位。任务多了不会出现整型溢出吗?这个不用担心,即使每秒能处理一百万个任务,20位的整型数足矣用N万年)。在系统中不同的模块有不同的任务,甚者同一模块中也有不同的任务类型。那么在从leveldb中读取数据重建任务队列时任务的区分就需要很重要了,因此我们引入了任务类型,将任务类型与任务的其他数据一起序列化保存到leveldb中,在反序列化时先读取任务类型,然后再根据任务类型来调用对应的反序列化函数。根据以上这些需求和做法,我们设计并实现了一套通用的类似于标准库的持久化容器(list、map)来更好的完成所需的功能。
在使用leveldb的过程中我们也遇到了一些问题,同时根据自己的实验以及网上的资料简单总结了一下: 1. 存入leveldb中的每个key所对应的内容不宜太大,超过32KB性能就会下降很快 2. 能够多个key内容合并写入的据尽量使用WriteBatch,这样会使得leveldb顺序写入文件中,性能更快。(前提是内存要做限制) 3. 将db/version_set.cc中的kTargetFileSize值变大,使得在大量数据写入后创建少量的文件 4. 一块磁盘最好只使用一个leveldb实例进行数据的读写,这样可以减少磁道寻址时间 5.由于leveldb是一个先写log,然后再通过后台线程将log文件压缩到对应的文件中,在这个过程中会产生一些临时的文件,从而使得磁盘的使用空间会比真实写入的内容容量要大,只有这些log文件被处理过后,磁盘空间才会与真实写入的内容大小相当。在1.14的版本中,如果磁盘被后续写入的数据写满了,后台压缩log的线程将会导致程序崩溃,大概会出现如类似下堆栈信息:
(_ZN7leveldb3log6Writer18EmitPhysicalRecordENS0_10RecordTypeEPKcm+0x84) [0x7fd34cdb7d94] (_ZN7leveldb3log6Writer9AddRecordERKNS_5SliceE+0x74) [0x7fd34cdb7f44] (_ZN7leveldb6DBImpl5WriteERKNS_12WriteOptionsEPNS_10WriteBatchE+0x1b3) [0x7fd34cdb2273] (_ZN7leveldb2DB3PutERKNS_12WriteOptionsERKNS_5SliceES6_+0x54) [0x7fd34cdacd94] (_ZN7leveldb6DBImpl3PutERKNS_12WriteOptionsERKNS_5SliceES6_+0x9) [0x7fd34cdacdd9]
不过在最新的1.15版本中,这个问题已得到了解决。 6. 如果磁盘被100%写满了,此时最好不要停止leveldb实例,不然下次就无法使用已有的数据了,当磁盘容量到100%时,原有的leveldb就无法打开了。在快速写入数据时,会产生大量的log文件,等这些log文件被后台压缩线程处理后,将会释放出很多被临时暂用的空间。 7. 在1.15版本中,如果使用NewIterator函数创建了leveldb::Iterator对象而没有delete该对象的话,在程序退出时将会报出如下错误: db/version_set.cc:806: leveldb::VersionSet::~VersionSet(): Assertion `dummy_versions_.next_ == &dummy_versions_' failed. 根据代码分析,这里assert失败的原因主要是为了防止内存泄露。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1243
24
AI攻克費馬大定理?數學家放棄5年職業生涯,將100頁證明變代碼 AI攻克費馬大定理?數學家放棄5年職業生涯,將100頁證明變代碼 Apr 09, 2024 pm 03:20 PM

費馬大定理,即將被AI攻克?而整件事最有意義的地方在於,AI即將解決的費馬大定理,正是為了證明AI無用。曾經,數學屬於純粹的人類智力王國;如今,這片疆土正被先進的演算法所破解,所踐踏。圖片費馬大定理,是一個「臭名昭著」的謎題,在幾個世紀以來,一直困擾著數學家。它在1993年被證明,而現在,數學家們有一個偉大計畫:用電腦把證明過程重現。他們希望在這個版本的證明中,如果有任何邏輯上的錯誤,都可以由電腦檢查出來。專案網址:https://github.com/riccardobrasca/flt

PyCharm實用技巧:將項目轉換為可執行EXE文件 PyCharm實用技巧:將項目轉換為可執行EXE文件 Feb 23, 2024 am 09:33 AM

PyCharm是一款功能強大的Python整合開發環境,提供了豐富的開發工具和環境配置,讓開發者更有效率地編寫和除錯程式碼。在使用PyCharm進行Python專案開發的過程中,有時候我們需要將專案打包成可執行的EXE文件,以便在沒有安裝Python環境的電腦上執行。本文將介紹如何使用PyCharm將專案轉換為可執行的EXE文件,同時給出具體的程式碼範例。首

深入了解PyCharm:快速刪除項目的方法 深入了解PyCharm:快速刪除項目的方法 Feb 26, 2024 pm 04:21 PM

標題:深入了解PyCharm:刪除專案的高效方式近年來,Python作為一種強大而靈活的程式語言,受到越來越多開發者的青睞。在Python專案的開發中,選擇一個高效的整合開發環境至關重要。 PyCharm作為一款功能強大的整合開發環境,為Python開發者提供了許多便利的功能和工具,其中包括快速、有效率地刪除專案目錄。以下將著重介紹如何使用PyCharm中的刪除

如何阻止Outlook自動將事件新增到我的日曆 如何阻止Outlook自動將事件新增到我的日曆 Feb 26, 2024 am 09:49 AM

作為電子郵件管理器應用程序,MicrosoftOutlook允許我們安排活動和約會。它透過提供在Outlook應用程式中建立、管理和追蹤這些活動(也稱為事件)的工具,使我們能夠保持有序。然而,有時會將不需要的事件加入Outlook中的日曆中,這會對使用者造成混亂,並向日曆發送垃圾郵件。在本文中,我們將探討可協助我們防止Outlook自動將事件新增至我的日曆中的各種方案和步驟。 Outlook活動-簡要概述Outlook事件具有多種用途,並具有許多有用的功能,具體如下:日曆整合:在Outlook

深入探討Struts框架的原理與實踐 深入探討Struts框架的原理與實踐 Feb 18, 2024 pm 06:10 PM

Struts框架的原理解析與實務探索Struts框架作為JavaWeb開發中常用的MVC框架,具有良好的設計模式和可擴展性,廣泛應用於企業級應用程式開發中。本文將對Struts框架的原理進行解析,並結合實際程式碼範例進行探索,幫助讀者更好地理解和應用該框架。一、Struts框架的原理解析1.MVC架構Struts框架是基於MVC(Model-View-Con

PHP編碼實踐:拒絕使用goto語句的替代方案 PHP編碼實踐:拒絕使用goto語句的替代方案 Mar 28, 2024 pm 09:24 PM

PHP編碼實踐:拒絕使用goto語句的替代方案近年來,隨著程式語言的不斷更新和迭代,程式設計師開始更加重視編碼規範和最佳實踐。在PHP程式設計中,goto語句作為一種控制流語句存在已久,但在實際應用中往往會導致程式碼的可讀性和可維護性下降。本文將分享一些替代方案,幫助開發人員拒絕使用goto語句,提升程式碼品質。一、為什麼拒絕使用goto語句?首先,讓我們來思考一下為

基礎教學:使用IDEA建立Maven項目 基礎教學:使用IDEA建立Maven項目 Feb 19, 2024 pm 04:43 PM

IDEA(IntelliJIDEA)是一款強大的整合開發環境,可協助開發人員快速且有效率地開發各種Java應用程式。在Java專案開發中,使用Maven作為專案管理工具能夠幫助我們更好地管理依賴函式庫、建置專案等。本文將詳細介紹如何在IDEA中建立一個Maven專案的基本步驟,同時提供具體的程式碼範例。步驟一:開啟IDEA並建立新專案開啟IntelliJIDEA

織夢CMS站群實作分享 織夢CMS站群實作分享 Mar 18, 2024 am 10:18 AM

織夢CMS站群實務分享近年來,隨著網路的快速發展,網站建置變得越來越重要。在建立多個網站時,站群技術成為了一個非常有效的方法。而在眾多網站建立工具中,織夢CMS憑藉其靈活性和易用性成為了不少站群愛好者的首選。本文將分享一些關於織夢CMS站群的實務經驗,以及一些具體的程式碼範例,希望能為正在探索站群技術的讀者提供一些幫助。 1.什麼是織夢CMS站群?織夢CMS

See all articles