【问题标题】:Memoizing SQL queries记忆 SQL 查询
【发布时间】:2014-10-14 08:32:12
【问题描述】:

假设我有一个运行 SQL 查询并返回数据帧的函数:

import pandas.io.sql as psql
import sqlalchemy

query_string = "select a from table;"

def run_my_query(my_query):
    # username, host, port and database are hard-coded here
    engine = sqlalchemy.create_engine('postgresql://{username}@{host}:{port}/{database}'.format(username=username, host=host, port=port, database=database))

    df = psql.read_sql(my_query, engine)
    return df

# Run the query (this is what I want to memoize)
df = run_my_query(my_query)

我想:

  1. 能够记忆我上面的查询,每个 query_string 值(即每个查询)都有一个缓存条目
  2. 能够按需强制缓存重置(例如基于某些标志),例如以便在我认为数据库已更改时更新我的​​缓存。

我如何使用joblibjug 做到这一点?

【问题讨论】:

标签: python pandas memoization joblib


【解决方案1】:

是的,你可以用joblib 来做这个(这个例子基本上是自己粘贴的):

>>> from tempfile import mkdtemp
>>> cachedir = mkdtemp()

>>> from joblib import Memory
>>> memory = Memory(cachedir=cachedir, verbose=0)

>>> @memory.cache
... def run_my_query(my_query)
...     ...
...     return df

您可以使用memory.clear() 清除缓存。


请注意,您也可以使用 lru_cache 甚至“手动”使用简单的 dict:

def run_my_query(my_query, cache={})
    if my_query in cache:
        return cache[my_query]
    ...
    cache[my_query] = df
    return df

可以使用run_my_query.func_defaults[0].clear() 清除缓存(虽然我不确定我是否会推荐这个,只是觉得这是一个有趣的例子)。

【讨论】:

  • 谢谢@Andy。有没有办法使用它来记忆一系列 Python 语句,而不必先将它们放在函数中?如果语句修改了几个变量,那么将所有内容包装到一个函数中只是为了记忆计算需要相当多的工作。
  • 在变异变量时使用无效策略进行记忆...也许 sep 问题来解释您正在尝试什么?
  • ^可能不是一个有效的策略
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2018-02-07
相关资源
最近更新 更多