像bdb。但是,我查看了 ocaml-bdb,似乎它只存储字符串。我的问题是我有存储大量数据的数组。当然,我可以将它们序列化为许多文件,或者对我的数据进行编码/解码并将它们放在数据库或那些键值数据库的东西上,这是我最后的手段。我想知道是否有更好的方法。
4 回答
HDF4 / HDF5 文件格式可能适合您的需要。见http://forge.ocamlcore.org/projects/ocaml-hdf/
除了 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 的数组变得相对简单。
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)和其他不错的东西(如压缩或加密)。
利用这些图书馆提供的电力。您需要了解键值组合。
过去有一个 ocaml BerkeleyDB 包装器: OCamlDB
显然有人最近调查了它: OCamlDB 的最新补丁
但是,来自 hcarty 的 GDAL 绑定可能已准备好生产并在某处密集使用。