4

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

4

4 回答 4

3

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

于 2012-07-18T11:10:16.940 回答
3

除了 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 的数组变得相对简单。

于 2017-01-18T16:50:41.597 回答
1

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

免责声明:我不知道 ocaml(但我知道 caml-light)并且我知道 berkeley 数据库(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 或sphinx 那样的专用算法,即。mvcc、btree、lsm、PSSI 等...

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

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

键值存储背后的想法是提供一个通用框架:

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

尽可能快地提供一些保证(如 ACID)和其他不错的东西(如压缩或加密)。

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

于 2017-09-19T17:28:15.013 回答
1

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

显然有人最近调查了它: OCamlDB 的最新补丁

但是,来自 hcarty 的 GDAL 绑定可能已准备好生产并在某处密集使用。

此外,在 opam 中有 dbm 的绑定:dbmcryptodbm

于 2017-08-29T06:11:29.427 回答