2012-07-17 122 views
4

(如bdb)上是否有ocaml庫存儲/使用數據結構。但是,我看着ocaml-bdb,好像它只是存儲字符串。我的問題是我有數組存儲巨大的數據。當然,我可以將它們序列化成許多文件,或者編碼/解碼我的數據,並將它們放在數據庫或鍵值db分支上,這是我的最後手段。我想知道是否有更好的方法。在磁盤

回答

2

除了jrouquie提到的HDF4綁定,還有HDF5綁定可用(http://opam.ocaml.org/packages/hdf5/)。取決於您要存儲的數據類型,有與GDAL的綁定(http://opam.ocaml.org/packages/gdal/)。

對於適合大陣列的數據,您也可以選擇內存映射磁盤上的大文件。例如,請參見https://caml.inria.fr/pub/docs/manual-ocaml/libref/Bigarray.Genarray.html#VALmap_file。雖然它將您與相當嚴格的磁盤格式聯繫在一起,但它操作比可用RAM大的數組的操作相對簡單。

1

有過去的OCaml的BerkeleyDB的包裝: OCamlDB

顯然,最近有人看着它: recent patch for OCamlDB

然而,從hcarty的GDAL綁定可能是生產做好準備,並在密集使用的地方。

此外,也有DBM綁定在OPAM:dbmcryptodbm

1

HDF5是prolly的答案,但考慮到的問題是有些模糊,另一種解決方案是可能的。

免責聲明:我不知道OCaml的(但我知道CAML的光),我知道伯克利數據庫(AKA bsddb(AKA BDB))。

但是,我看着ocaml-bdb,好像它只是用來存儲字符串。

這可能是在ocaml-bdb,但實際上它存儲字節。我不確定你的情況,因爲在Python2中,字節和unicode字符串之間沒有區別。直到最近,Python 3纔得到了適當的字節類型,並且bdb綁定需要並且吐出字節。也就是說,這種差異是微不足道的,但你寧願使用字節,因爲bdb可以理解和使用。

我的問題是我有一個巨大的存儲數據數組。當然,我可以序列化他們到許多文件,或編碼/解碼,我的數據,並把它們放在數據庫

或使用這些鍵值分貝的東西,這是我最後的手段。

我想知道是否有更好的方法。

這取決於你所需要和數據的外觀。

  • 如果數據可以全部保留在內存中,則應該將內存轉儲到文件並加載回去。

如果您需要在多種體系結構或操作系統之間共享數據,則寧願使用像HDF5這樣的序列化框架。請記住,HDF5不處理循環引用。

如果數據不能在內存中留下的所有,那麼你需要使用類似BDB(或wiredtiger)。

爲什麼BDB(或wiredtiger)

簡單地說,幾十年工作已進入:

  • 分割數據
  • 存儲在磁盤上
  • 檢索數據

儘可能快。

wiredtiger是BDB的繼任者。

所以,是的,你可以分割的文件自己等人。但這需要很多工作。只有專業團隊才能做到這一點(彭博社包括......),在管理自己的人中間,有着名的postgresql,mariadb,google和algolia

有序鍵值商店像wiredtiger和BDB使用類似的算法,以更高的層次數據庫,如PostgreSQL和MySQL或專門的一個類似的Lucene/Solr的或獅身人面像即。 MVCC,B樹,LSM,PSSI等等

MongoDB的,因爲3.2使用wiredtiger後端存儲的所有數據。

有些人認爲,key-value存儲所不擅長的存儲關係型數據,即說,一些項目開始在關鍵值存儲的頂部做分佈式數據庫。這是一個線索,它是有用的。例如。 FoundationDB或CockroachDB。

鍵值存儲背後的想法是提供一個通用的框架:

  • 分割數據
  • 存儲在磁盤上
  • 檢索數據

越快越好,給予一些保證(如ACID)和其他好處(如壓縮或加密)。

利用這些圖書館提供的電力優勢。您需要了解鍵值組合