我有一个 200MB 大小的 csv 文件,其中包含一些行,其中关键术语与第二列内的字符串列表相匹配。
term_x | ["term_1","term_2"]
term_y | ["term_1","term_2"]
term_z | ["term_1","term_2"]
我的 Django 应用程序未配置为使用任何复杂的内存缓存(Redis、Memcached),在实践中,我想将一个术语传递到数据库表中以检索相应的列表值。然而,由于其大小,除了加载页面时执行的其他操作之外,从正确的行检索列表大约需要半秒的时间。
Django 是否可以在服务器启动时“预缓存”该表?即,将所有这些值添加到缓存中,并以第一列为键?我尝试过类似的方法,通过覆盖 app.py 中的“ready”方法来在启动时将数据库表加载到缓存中,但是当我尝试使用我知道表中的术语时,我得到空值:
class MyAppConfig(AppConfig):
name = 'test_display'
def ready(self):
print("Loading RS Lookup cache..."),
#setup database connection....
cache_df = pd.read_sql_query("Select * from table_to_cache", engine)
print("Table loaded")
for index, row in cache_df.iterrows():
cache.set(row['term'], row['list_of_terms'], None)
print("RS Table loaded")
同一个 Django 应用程序中我的 init.py 只有一行:
default_app_config = 'test_display.apps.MyAppConfig'
检查下列是否正确:
在项目设置中,您未配置缓存或使用本地内存缓存,如文档中所述。
您仅使用默认缓存(
from django.core.cache import cache
)或正确处理缓存名称。
确保
.ready()
中的代码实际上存储了您稍后尝试读取的值。您可以使用以下其中一项:
assert "my_term" in cache, "The term is not cached!"
或
from django.core.cache.backends import locmem
print(locmem._caches)
# now check what you have inside using your very own eyes and patience
至于以下:
Django 中是否可以“预缓存”...?
您的解决方案利用 AppConfig.ready(),这通常是服务器每个实例只执行一次的活动的好地方。至少我不知道有更好的解决方案。