【问题标题】:Share large python objects efficiently among requests in Django?在 Django 中的请求之间有效地共享大型 python 对象?
【发布时间】:2023-02-09 01:42:46
【问题描述】:

我想在 Django 中共享一些大型 python 对象。它们只是我想在内存中快速随机访问的大数据表。想想只读一个字典,比如磁盘上的 35M。所以,不是很大,也不是很小。我认为它们是不可变的。也就是说,在初始化时读入,永远不要更改它们。我愿意重新启动服务器以进行更改。

最好的、对 Django 最友好的方法是什么?

This question 跟我一样。 This answer 描述了如何使用 Django 的低级内存缓存。阅读the documentation,有一个in-memory cache是进程内和线程安全的。完美的。然而,只有可以腌制的对象。我不想让我的 35M python 对象被腌制,这看起来很尴尬。然后把它拿回来再解开它吗?根据要求?听起来很慢。

This blog post 提到了 django-lrucache-backend,它跳过了酸洗。然而,它最后一次更新是在 2 年前,并且还说不要将它用于“大数据表”(不知道为什么)。

建议?

编辑:我理解传统的答案,但我宁愿避免酸洗和 Redis。两个原因:1) 我宁愿避免编写一堆代码行 (pickling) 或维护另一个组件 (Redis),2) unpickle 大对象似乎更慢(是在每个请求上吗?)。

【问题讨论】:

    标签: django caching


    【解决方案1】:

    根据您要存储的对象,您需要进行 pickle 和 unpickle。但这不是性能问题。你有两种可能性,如果它是一个字典,你可以使用 JSON 结构,否则只需使用 django-redis 作为缓存后端,让 django 将对象存储在缓存(redis)中。 Django-redis 还支持连接池。

    【讨论】:

    • 但是我不想pickle和unpickle,我不想写代码把dict变成json,我不想安装和维护redis。我只想使用内存中的一个对象。
    • 不起作用。一个python对象是一个特定的编程对象。每个存储只能存储二进制或文本格式。
    • 感谢您的答复。我不想存储,只保留在内存中,在特定的过程中。
    • Store 或 hold 是一样的,它必须是一种交换格式,这不是 python 对象。
    • 我不知道“必须是”从何而来。对于计算机来说,很多事情都是可能的,包括在内存中共享 python 对象。
    【解决方案2】:

    我最终将我的数据挂在Django AppConfig object 上,特别是ready method。

    其他人似乎也这样做,例如here。该示例没有使用 ready 方法,但它确实使用了 AppConfig。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      相关资源
      最近更新 更多