为什么违约_斯托拉特存在后端内存为Django()的存储桶S3出现大错误?

2024-09-28 15:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在运行default_storage.exists()时,我遇到了使用S3Boto后端的django-storages的内存泄漏

我在看这里的文件: http://django-storages.readthedocs.org/en/latest/backends/amazon-S3.html

以下是我的设置文件的相关部分:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

以下是我要重复的问题:

^{pr2}$

我想到的唯一可能的问题是,我的S3存储桶中有93000个条目—我想知道.exists是否只是为了检查而下载整个文件列表?如果是这样,肯定还有别的办法吗?不幸的是,sorl thumbnail在生成新缩略图时使用了这个.exists()函数,这导致缩略图生成非常缓慢。在


Tags: 文件django内存orghttpdefaults3exists
1条回答
网友
1楼 · 发布于 2024-09-28 15:34:26

更新(2017年1月23日)

为了避免这种情况,您只需在创建Storage时传递preload_metadata=False,或者在设置中设置AWS_PRELOAD_METADATA = False。在

感谢@r3mot在评论中的建议。在

原始答案

实际上,这是因为S3BotoStorage.exists调用了S3BotoStorage.entries,如下所示:

    @property
    def entries(self):
        """
        Get the locally cached files for the bucket.
        """
        if self.preload_metadata and not self._entries:
            self._entries = dict((self._decode_name(entry.key), entry)
                                for entry in self.bucket.list(prefix=self.location))

处理这种情况的最佳方法是将S3BotoStorage子类化,如下所示:

^{pr2}$

你只需要把这个子类放到你的应用程序的一个模块中,然后通过你的设置模块中的虚线路径引用它。这个子类的唯一缺点是,对3个重写方法中的任何一个的每次调用都将导致一个web请求,这可能不是什么大问题。在

相关问题 更多 >