Django应用程序在内存中有一个大的Panda对象在所有请求中共享?

时间:2015-11-12 00:15:19

标签: python r django pandas shiny

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

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

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

我到处寻找,但找不到任何办法。我发现了这个问题:https://stackoverflow.com/questions/28661255/pandas-sharing-same-dataframe-across-the-request但它没有回应。

为什么我需要将数据存入RAM?因为我需要性能来快速呈现所询问的结果。我不能要求MariaDB计算和维护这些数据,例如,因为它涉及一些计算,单独的R或Python或其他语言的专用包可以做。

2 个答案:

答案 0 :(得分:3)

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

我使用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工作者都会加载一次表,所以在这里要小心。

答案 1 :(得分:1)

我可能误解了这个问题,但对于我来说,用户可以轻松访问的4 GB数据库表不应该是一个太大的问题。实际上只是像你描述的那样预先加载一次数据有什么问题吗?现在4GB并不是太多RAM。

我个人建议您只使用数据库系统本身而不是将内容加载到内存中并使用python进行处理。如果您正确设置数据,您可以在几秒钟内发出数千个查询。 Pandas实际上是为了模仿SQL而编写的,因此您使用的大部分代码都可能直接转换为SQL。就在最近,我遇到了一个工作情况,我设置了一个大的连接操作,主要是使用pandas获取几百个文件(总共约4GB,每个文件600k行)。总执行时间最终变为72小时或者其他什么,这是一个必须每小时运行一次的操作。一位同事最终重写了相同的python / pandas代码作为一个非常简单的SQL查询,在5分钟而不是72小时内完成。

无论如何,我建议您考虑将pandas数据帧存储在实际的数据库表中。 Django构建在一个数据库(通常是mySQL或Postgres)上,pandas甚至还有一个函数可以直接将数据帧插入数据库dataframe.to_sql( 'database_connection_str' )!从那里你可以编写django代码,这样响应将对DB进行单个查询,获取值并及时返回数据。