bdbのように。しかし、私はocaml-bdbを見て、文字列のみを格納するように作られているようです。私の問題は、巨大なデータを格納する配列があることです。もちろん、それらを多くのファイルにシリアル化することも、データをエンコード/デコードしてデータベースまたはそれらのKey-Valueデータベースに配置することもできます。これが私の最後の手段です。もっと良い方法があるのだろうかと思います。
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/)へのバインディングがあります。
bigarrayに収まるデータの場合、ディスク上の大きなファイルをメモリマッピングするオプションもあります。たとえば、https://caml.inria.fr/pub/docs/manual-ocaml/libref/Bigarray.Genarray.html#VALmap_fileを参照してください。かなり厳密なオンディスクフォーマットに縛られますが、使用可能なRAMよりも大きいアレイの操作は比較的簡単になります。
過去にocamlBerkeleyDBラッパーがありました: OCamlDB
どうやら誰かが最近それを調べました: OCamlDBの最近のパッチ
ただし、hcartyのGDALバインディングは、おそらく本番環境に対応しており、どこかで集中的に使用されています。
HDF5は完全に答えですが、質問がやや曖昧であることを考えると、別の解決策が可能です。
免責事項:私はocamlを知りません(しかし、私はcaml-lightを知っていました)そして私はberkeleyデータベース(別名bsddb(別名bdb))を知っています。
しかし、私はocaml-bdbを見て、文字列のみを格納するように作られているようです。
それはおそらく真実ですocaml-bdb
が、実際にはバイトを格納します。Python2では、Unicode文字のバイトと文字列に違いがなかったため、あなたのケースについてはよくわかりません。Python 3が適切なバイト型を取得し、bdbバインディングがバイトを取得して吐き出すのは最近までです。とはいえ、違いは微妙ですが、bdbが理解して使用するものであるため、バイトを使用する方がよいでしょう。
私の問題は、巨大なデータを格納する配列があることです。もちろん、それらを多くのファイルにシリアル化することも、データをエンコード/デコードしてデータベースに配置することもできます
または、これらのKey-Valueデータベースを使用します。これが私の最後の手段です。
もっと良い方法があるのだろうかと思います。
それはあなたの必要性とデータがどのように見えるかに依存します。
- データがすべてメモリ内にとどまることができる場合は、メモリをファイルにダンプしてロードし直すことをお勧めします。
複数のアーキテクチャまたはオペレーティングシステム間でデータよりも共有する必要がある場合は、HDF5などのシリアル化フレームワークを使用することをお勧めします。HDF5は循環参照を処理しないことに注意してください。
データをすべてメモリに保持できない場合は、bdb(またはwiredtiger)などを使用する必要があります。
なぜbdb(またはwiredtiger)なのか
簡単に言うと、数十年の作業が次のように行われています。
- データの分割
- ディスクに保存する
- データを取得する
できるだけ早く。
Wiredtigerはbdbの後継です。
そうです、ファイルを自分で分割することもできます。しかし、それは多くの作業を必要とします。専門の会社だけがそれを行います(ブルームバーグを含む...)、上記のすべてを自分で管理する人々の中には、有名なpostgresql、mariadb、google、algoliaがあります。
Wiredtigerやbdbなどの順序付けされたキー値ストアは、postgresqlやmysqlなどの高レベルのデータベース、またはlucene/solrやsphinxなどの特殊なデータベースと同様のアルゴリズムを使用します。mvcc、btree、lsm、PSSIなど..
3.2以降のMongoDBは、すべてのデータを格納するためにwiredtigerバックエンドを使用します。
一部の人々は、Key-Valueストアはリレーショナルデータの保存が苦手であると主張し、いくつかのプロジェクトがKey-Valueストアの上に分散データベースを作成し始めたと述べています。これは便利な手がかりです。例:FoundationDBまたはCockroachDB。
Key-Valueストアの背後にある考え方は、次の一般的なフレームワークを提供することです。
- データの分割
- ディスクに保存する
- データを取得する
可能な限り迅速に、いくつかの保証(ACIDなど)とその他の便利な機能(圧縮や暗号化など)を提供します。
それらの図書館による電力提供を利用するため。Key-Value構成について学ぶ必要があります。