我有一个大型数据库(大约 150 000 条记录),我想将其嵌入到名为compute.ml 的 OCaml 源代码中。我正在尝试(没有成功)将这些表转换为哈希表,并将这些哈希表嵌入到函数compute
中,以便使二进制程序快速运行,而无需对外部sql数据库进行查询。
我有 2 个问题:
- 有没有办法将 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"
最佳答案
我会有一个包含 mysql 表的 .csv 文件 data.csv
,并导出为 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
时都会使用内存中已有的变量 数据
。
如果您担心读取和解析 csv 文件,您可以查看 Marshal
模块,以存储变量 data
的二进制版本。
请注意,read_csv
不在标准库中,但例如 http://csv.forge.ocamlcore.org/ .
关于mysql - 来自 mysql 的 ocaml 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12350982/