如何从FileField缓存文件以避免重复(Django,DRF)

时间:2018-04-19 16:58:00

标签: django python-3.x caching django-rest-framework

要点:

我想缓存从FileField读入的文件,以优化DRF API的性能。

背景:

系统允许用户使用FileField(django / djangorestframework后端)上传数据文件(类似csv)并存储指向这些文件的链接。

模型对象具有其他方法,这些方法对存储在FileField文件中的数据起作用...即获取列名,行数,特定数据查询(来自ix 0 - > 10的col A)

这些方法中的每一种都要求在返回数据之前读入文件。

我发现每个查询所需的文件对象加载和重新加载都耗费了大量的CPU和响应时间。

是否有一种智能方法可以缓存已经读入的文件(超时)并且django会阻止重新加载已经缓存的文件?

我已经看到了一些关于memcached的信息,但这似乎更倾向于缓存特定的API调用而不是底层的数据库对象/数据。

感谢您的帮助!

1 个答案:

答案 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

如果有人能想到一个更简单的方法,我可以接受建议,但现在这解决了我的问题。