【问题标题】:How to cache files from FileField to avoid repeat (Django, DRF)如何从 FileField 缓存文件以避免重复(Django,DRF)
【发布时间】:2018-09-30 06:34:42
【问题描述】:

总结:

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

背景:

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

模型对象具有作用于存储在 FileField 文件中的数据的附加方法...即获取列名、行数、特定数据查询(从 ix 0 -> 10 的列 A)

这些方法中的每一个都需要在返回数据之前读取文件。

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

有没有一种聪明的方法来缓存已经读入的文件(有超时)并让 django 阻止重新加载已经缓存的文件?

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    在进行了更多挖掘之后,我发现这个有用的链接通常是关于 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
    

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

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 2011-05-12
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 2016-07-24
      • 2019-08-15
      • 1970-01-01
      相关资源
      最近更新 更多