是否存在ocaml库存储/使用磁盘上的数据结构

时间:2012-07-17 00:48:12

标签: serialization ocaml berkeley-db

像pdb一样。但是,我查看了ocaml-bdb,看起来它只是存储字符串。我的问题是我有存储巨型数据的数组。当然,我可以将它们序列化为多个文件,或者编码/解码我的数据并将它们放在数据库或那些键值db的东西上,这是我的最后手段。我想知道是否有更好的方法。

4 个答案:

答案 0 :(得分:2)

HDF4 / HDF5文件格式可能适合您的需要。见http://forge.ocamlcore.org/projects/ocaml-hdf/

答案 1 :(得分:2)

除了jrouquie提到的HDF4绑定外,还有可用的HDF5绑定(http://opam.ocaml.org/packages/hdf5/)。根据您要存储的数据类型,存在与GDAL(http://opam.ocaml.org/packages/gdal/)的绑定。

对于可以放入bigarray的数据,您还可以选择在磁盘上映射大文件。例如,请参阅https://caml.inria.fr/pub/docs/manual-ocaml/libref/Bigarray.Genarray.html#VALmap_file。虽然它将您绑定到相当严格的磁盘格式,但它确实使操作比可用RAM大的数组变得相对简单。

答案 2 :(得分:1)

过去有一个ocaml BerkeleyDB包装器: OCamlDB

显然有人最近调查了它: recent patch for OCamlDB

然而,来自hcarty的GDAL绑定可能是生产就绪并且在某些地方密集使用。

此外,opam中有dbm绑定:dbmcryptodbm

答案 3 :(得分:1)

HDF5是答案,但鉴于问题有些模糊,另一种解决方案是可能的。

免责声明:我不知道ocaml(但我知道caml-light),我知道berkeley数据库(AKA.bsddb(AKA bdb))。

  

然而,我查看了ocaml-bdb,似乎只是为了存储字符串。

ocaml-bdb中可能也是如此,但实际上它存储了字节。我不确定你的情况,因为在Python2中,unicode字符的字节和字符串之间没有区别。直到最近,Python 3获得了正确的字节类型,并且bdb绑定采用并吐出字节。也就是说,差异很小,但你宁愿使用字节,因为这是bdb理解和使用的。

  

我的问题是我有存储巨型数据的数组。当然,我可以将它们序列化为许多文件,或者编码/解码我的数据并将它们放在数据库中

     

或使用那些键值db的东西,这是我的最后手段。

     

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

这取决于您的需求以及数据的外观。

  • 如果数据都可以留在内存中,您宁愿将内存转储到文件中并加载回来。

如果您需要在多个体系结构或操作系统之间共享数据,那么您更喜欢使用像HDF5这样的序列化框架。请记住,HDF5不处理循环引用。

如果数据不能全部留在内存中,那么你需要使用像bdb(或wiredtiger)这样的东西。

为什么选择bdb(或wiredtiger)

简单地说,几十年的工作已经进入:

  • 拆分数据
  • 将其存储在磁盘上
  • 检索数据

尽快。

wiredtiger是bdb的继承者。

所以是的,你可以自己分割文件等。但这需要大量的工作。只有专门的公司才能这样做(包括bloomberg),在自我管理的人中,有着名的postgresql,mariadb,google和algolia

有线键值存储(如wiredtiger和bdb)使用类似的算法来处理更高级别的数据库,如postgresql和mysql,或者像lucene / solr或sphinx ie这样的专用数据库。 mvcc,btree,lsm,PSSI等...

MongoDB从3.2开始使用wiredtiger后端来存储所有数据。

有些人认为键值存储不擅长存储关系数据,有些人认为几个项目开始在关键值存储之上进行分布式数据库。这是一个有用的线索。例如。 FoundationDB或CockroachDB。

键值存储背后的想法是为以下内容提供通用框架:

  • 拆分数据
  • 将其存储在磁盘上
  • 检索数据

尽可能快地提供一些保证(如ACID)和其他好处(如压缩或加密)。

利用这些图书馆的电力供应。您需要了解键值组合