2012-07-17 129 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)和其他好处(如压缩或加密)。

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