python - Django 应用程序在内存中有一个在所有请求之间共享的 Pandas 对象?

标签 python r django pandas shiny

我开发了一个 Shiny 的应用程序。当它启动时,它加载一次,一些数据表。大约 4 GB 的数据表。然后,连接到该应用程序的人可以使用该界面并使用这些数据表。

此应用程序不错,但有一些限制。这就是为什么我正在寻找另一种解决方案。

我的想法是让 Pandas 和 Django 一起工作。这样,我可以同时开发接口(interface)和 RESTful API。但我需要的是所有到达 Django 的请求都可以使用已加载一次的 pandas 数据表。想象一下,如果任何请求都必须加载 4 GB 的内存......那将是可怕的。

我找遍了所有地方,但找不到任何方法来做到这一点。我发现了这个问题:https://stackoverflow.com/questions/28661255/pandas-sharing-same-dataframe-across-the-request但它没有任何反应。

为什么我需要将数据放在 RAM 中?因为我需要性能来快速呈现要求的结果。例如,我不能要求 MariaDB 计算和维护这些数据,因为它涉及一些仅 R 或 Python 或其他语言中的专用包可以完成的计算。

最佳答案

我有一个类似的用例,我只想加载(实例化)某个对象一次并在所有请求中使用它,因为加载需要一些时间(秒)而且我无法承受会引入的延迟对于每个请求。

我使用了 Django>=1.7 中的一个特性,AppConfig.ready()方法,只加载一次。

代码如下:

# apps.py
from django.apps import AppConfig
from sexmachine.detector import Detector

class APIConfig(AppConfig):
    name = 'api'

    def ready(self):
        # Singleton utility
        # We load them here to avoid multiple instantiation across other
        # modules, that would take too much time.
        print("Loading gender detector..."),
        global gender_detector
        gender_detector = Detector()
        print("ok!")

然后当你想使用它的时候:

from api.apps import gender_detector
gender_detector.get_gender('John')

ready() 方法中加载您的数据表,然后在任何地方使用它。我估计每个 WSGI worker 都会加载一次表,所以在这里要小心。

关于python - Django 应用程序在内存中有一个在所有请求之间共享的 Pandas 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33662287/

相关文章:

Python:动态访问属性的类型注释

Python unicode编码问题

python - 在哪里可以找到 Python 2.7 的多处理模块导入的 select 模块?

r - "Could not find function"包中的错误 'caret',R

django - Django 在哪里存储身份验证 super 用户/密码/电子邮件数据?

python - Amazon ec2 - 部署 python 应用程序

r - 主要情节标题中的斜体和普通文本

r - 制作ggplot线图,其中线遵循行顺序

django - 在 Django 中处理 JSON 的最佳方式

python - django 1.8 中的 ImageField 类不在模板中显示图像