2

我有一个大型数据库(大约 150 000 条记录),我想将它嵌入到名为 compute.ml 的 OCaml 源代码中。我正在尝试(没有成功)将这些表转换为哈希表并将这些哈希表嵌入到一个函数compute中,以便让二进制程序快速运行,而无需对外部 sql 数据库进行查询。

我有两个问题:

  • 有没有办法将一个 mysql 表导出到一个关联数组 (Hashtbl) 中,该数组可以被我的 OCaml 函数访问(甚至嵌入)compute(它本身被编译并用作二进制文件)?
  • 这个哈希表是永久加载在函数中还是每次在二进制文件中调用函数时都要重新启动它?

我有一个包含 142741 条记录的 mysql 表,以 CSV 格式导出,如下所示:

"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

我会有一个 .csv 文件data.csv,其中包含您的 mysql 表,导出为 csv 格式。然后在 OCaml 中,我会在程序启动时读取并解析这个文件一次:

let data = read_csv("data.csv")

data因此是一个变量,类型为Hashtbl.t,包含您的 150K 记录。然后,一个 OCaml 函数(compute在您的问题中调用)使用此变量:

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

这样,就不会调用 MySQL 服务器,在启动程序时只读取一次数据,然后对函数的每次调用都compute使用已经在内存中的变量data

如果您担心读取和解析 csv 文件,您可能会查看Marshal模块,以存储变量的二进制版本data

请注意,read_csv它不在标准库中,但例如http://csv.forge.ocamlcore.org/

于 2012-09-10T11:55:02.327 回答