gpt4 book ai didi

python - db中memoization的数据结构

转载 作者:行者123 更新时间:2023-12-04 21:11:33 27 4
gpt4 key购买 nike

在数据库中缓存(保存/存储/内存)这么多功能结果的最佳数据结构是什么。
假设函数 calc_regress 在 python 中具有流动定义:

def calc_regress(ind_key, dep_key, count=30):
independent_list = sql_select_recent_values(count, ind_key)
dependant_list = sql_select_recent_values(count, dep_key)
import scipy.stats as st
return st.linregress(independent_list, dependant_list)

我看到了 What kind of table structure should be used to store memoized function parameters and results in a relational database? 的答案但它似乎解决了只有一个功能的问题,而我有大约 500 个功能。

最佳答案

选项 A

您可以使用链接答案中的结构,未标准化,列数 = 500 个函数中的最大参数数。还需要为函数名称添加一列。

然后你可以做一个 SELECT * FROM expensive_func_results WHERE func_name = 'calc_regress' AND arg1 = ind_key AND arg2 = dep_key and arg3 = count , ETC。

当然,这不是一个很好的设计。对于使用较少参数调用的相同函数,需要忽略具有空值/不匹配的列;否则你会得到多个结果行。

选项 B

创建表/结构为func_name , arguments , result其中 'arguments' 始终是 kwargs 字典或位置 args,但每个条目不混合。即使将 kwargs 字典存储为字符串,其中的键-> 值的顺序也是不可预测/一致的,即使它是相同的参数。因此,您需要先订购它,然后再转换为字符串并存储它。当您要查询时,您将使用 SELECT * FROM expensive_func_results WHERE func_name = 'calc_regress' AND arguments = 'str(kwargs_dict)' , 其中 str(kwargs_dict)是您将以编程方式设置的内容。它也可以设置为 inspect.getargspec 的结果, (或 inspect.getcallargs )尽管您必须检查一致性。

除非您将所有参数提供给查询或与 LIKE 部分匹配,否则您将无法对参数组合进行查询。 .

选项 C

一路归一化:一张表func_callsfunc_name , args_combo_id , arg_name_idx , arg_value .表的每一行都将为该函数的调用参数的一个组合存储一个参数。另一 table func_resultsfunc_name , args_combo_id , result .您还可以进一步标准化 func_name映射到 func_id .

在这一个中,关键字 args 的顺序无关紧要,因为您将执行内部联接来选择每个参数。该查询必须以编程方式构建或通过存储过程完成,因为获取所有参数所需的连接数由参数数决定。您上面的函数有 3 个参数,但您可能有另一个有 10 个参数。arg_name_idx是“参数名称或索引”,因此它也适用于混合 kwargs + args。在 calc_regress(ind_key=1, dep_key=2, count=30) 等情况下可能会出现一些重复。和 calc_regress(1, 2, 30) (以及 calc_regress(1, 2) 的默认值 count <--应该避免这种情况,表条目应该包含所有参数);自从args_combo_id两者都会有所不同,但结果显然是相同的。同样,检查模块可能会在这方面有所帮助。

[编辑] PS:另外,对于 func_name ,您可能需要使用完全限定名称以避免包中的模块之间发生冲突。装饰器也可能会干扰它;没有 deco.__name__ = func.__name__ , ETC。

PPS:如果将对象传递给数据库中正在内存的函数,请确保它们的 __str__是有用且可重复/一致的存储为 arg 值的东西。

这种特殊情况不需要您从数据库中的 arg 值重新创建对象,否则,您需要制作 __str____repr__喜欢的方式 __repr__ was intended to be (但通常不会完成):

this should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment).

关于python - db中memoization的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33449890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com