2012-04-30 66 views
0

我可以使用什麼來將數據快速序列化到C++ 11中的多個文件中(爲了避免數據冗餘我假設我將數據拆分爲多個表並將它們加入到它的ID號中)?非常快速的序列化。隨機訪問C++

我想使用:與fstream.read()fstream.write()訪問

  1. 簡單的二進制文件。
  2. 使用mmap
  3. 功能谷歌protobuf(如果我可以訪問隨機元素,而不是遍歷所有這些元素)。

所有表將包括列有以下數據類型: uint8uint16uint32uint64string

+0

序列化和I/O是不同的東西。當你不得不處理文件時,我不會過於擔心序列化速度。 – 2012-04-30 16:31:59

+1

我的第一個傾向是考慮[SQLite](http://www.sqlite.org/)。 –

+0

SQLite不是一個選項,當我必須處理大量數據時(sqlite文件大約有8GB)。 – Dejwi

回答

1

快速隨機訪問將是這裏的挑戰。實現這一點的最簡單方法是保持每一行的大小不變。使用protobuf s沒有簡單的方法,除非您假定保守的最大尺寸。使用前兩個選項(假設您對字符串的大小有合理的限制)應該相對容易。

但是,您可以隨意更復雜。使用protobuf s可能會比天真的序列化使用更少的空間,因此您將留下內存來構建索引。即使是一個相對較小的索引(比如說,從表格行號映射到每100行一個文件偏移量)也會給你快速的隨機訪問並使用更少的空間。當然,這比簡單的每一行是相同尺寸的方法要複雜得多。

1

分隔數字和字符串存儲。

稀疏表,數字數據

使用針對數字類型的列的列存儲。列存儲不存儲NULL值,並提供允許您重新生成表格行的連接邏輯。

不是單向查找隨機訪問,但空間折衷可能會贏,特別是如果列存儲索引留在內存中。

密表,數字數據

MMAP一個文件進行讀取。以恆定寬度按行存儲數據。您可能需要調整文件打開參數才能獲得所需的緩存和預讀優勢。

使用fstream.write()進行寫入可能會更快。

字符串數據

根據您的建議,這聽起來像你的設計允許寫入表一下子,然後執行從該點向前只讀隨機訪問。如果是這樣,看看Google's SSTable。這是一個爲可變長度數據提供高效隨機訪問的存儲層。

1

MIT許可的序列化庫Cap’n Proto可能提供您需要的功能。它由Google Protobuf Kenton Varda的主要作者撰寫。

A quote他: Cap'n Proto使用指針來支持完全隨機訪問。這意味着你可以做像mmap()這樣的巨型文件,並拉出一個內部對象而不實際處理整個事物,或者以不同的順序訪問子對象。

你提到的數據類型(uint8,uint16,uint32,uint64,string)都支持Cap'n Proto Schema Language