要点:
我想缓存从FileField读入的文件,以优化DRF API的性能。
背景:
系统允许用户使用FileField(django / djangorestframework后端)上传数据文件(类似csv)并存储指向这些文件的链接。
模型对象具有其他方法,这些方法对存储在FileField文件中的数据起作用...即获取列名,行数,特定数据查询(来自ix 0 - > 10的col A)
这些方法中的每一种都要求在返回数据之前读入文件。
我发现每个查询所需的文件对象加载和重新加载都耗费了大量的CPU和响应时间。
是否有一种智能方法可以缓存已经读入的文件(超时)并且django会阻止重新加载已经缓存的文件?
我已经看到了一些关于memcached的信息,但这似乎更倾向于缓存特定的API调用而不是底层的数据库对象/数据。
感谢您的帮助!
答案 0 :(得分:2)
在做了一些挖掘后,我发现这个有用的链接关于python中的简单缓存示例(https://www.blog.pythonlibrary.org/2016/02/25/python-an-intro-to-caching/)
使用这种方法,我在模型类本身中创建了一个属性,用于读取数据,如下所示:
FILECACHE = TableDataCache() # Class implemented similar to the link above
class TableData(models.Model):
file = models.FileField(blank=False, null=False, upload_to='table_data')
# other fields created here
@property
def data(self) -> pd.DataFrame:
if FILECACHE.has_key(self.file.path):
return FILECACHE[self.file.path]
data = pd.read_csv(self.file.path)
FILECACHE.update(self.file.path, data)
return data
如果有人能想到一个更简单的方法,我可以接受建议,但现在这解决了我的问题。