答案 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绑定可能是生产就绪并且在某些地方密集使用。
答案 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)这样的东西。
简单地说,几十年的工作已经进入:
尽快。
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)和其他好处(如压缩或加密)。
利用这些图书馆的电力供应。您需要了解键值组合。