2

私は、compute.ml という名前の OCaml ソース コードに埋め込みたい大規模なデータベース (約 150,000 レコード) を持っています。これらのテーブルを hashtables に変換し、これらの hastables を function に埋め込んで(成功せずに) compute、外部の SQL データベースにクエリを実行することなくバイナリプログラムをすばやく実行できるようにしようとしています。

2 つの質問があります。

  • compute私のOCaml関数(それ自体がコンパイルされ、バイナリとして使用される)によってアクセスできる(または埋め込まれている)連想配列(Hashtbl)にmysqlテーブルを一度エクスポートする方法はありますか?
  • このハッシュテーブルは関数に永続的にロードされますか、それともバイナリ内で関数が呼び出されるたびに再起動する必要がありますか?

CSV形式でエクスポートすると、次のようになる142741レコードのmysqlテーブルがあります。

"1";"27";"10";"coco";"0";"730";"1641025";"1641053";"foo";"1";"S";"0"
"2";"27";"11";"kiki";"0";"730";"1641054";"1641083";"bar";"1";"S";"0"
"3";"27";"12";"toto";"0";"730";"1641084";"1641113";"foofoo";"1";"S";"0"
"4";"27";"1";"tata";"0";"730";"1641114";"1641142";"barbar";"1";"S";"0"
...
"142741";"5";"7";"chotto";"0";"1347";"1971472";"1971500";"lastrecord";"1";"S";"0"
4

1 に答える 1

2

data.csvcsv形式にエクスポートされたmysqlテーブルを含む.csvファイルがあります。次に、OCaml で、プログラムの起動時にこのファイルを 1 回読み取り、解析します。

let data = read_csv("data.csv")

dataしたがって、 はHashtbl.t、150K レコードを含むタイプの変数です。次に、OCaml 関数 (compute質問で呼び出されます) がこの変数を使用します。

let compute x =
  let foo = Hashtbl.find data x in
  ...

このように、MySQL サーバーへの呼び出しはなく、データはプログラムの起動時に 1 回だけ読み取られ、関数への各呼び出しcomputeは既にメモリ内にある変数を使用しますdata

csv ファイルの読み取りと解析が気になる場合Marshalは、変数のバイナリ バージョンを格納するモジュールを確認してくださいdata

read_csv標準ライブラリにはありませんが、たとえばhttp://csv.forge.ocamlcore.org/があることに注意してください。

于 2012-09-10T11:55:02.327 に答える