在Flask应用中用Pandas快速存储数据

9 投票
1 回答
5871 浏览
提问于 2025-04-18 12:35

我对的运行速度、数据加载和使用的简单性印象深刻,想利用这些优点(还有其他一些)来处理一些较大的数据集(大约10万到20万行,少于20列)。我的目标是在一些计算节点上处理数据,同时通过Flask在浏览器中展示这些数据集。

目前我使用Postgres数据库来存储数据,但是从csv文件导入数据的过程很慢、麻烦且容易出错,从数据库中提取和处理数据也没好到哪里去。导入后数据不会再改变(没有增删改查操作),所以我觉得把数据存储为几个pandas的DataFrame(以hdf5格式存储,通过pytables加载)是个不错的选择。

我有几个问题:

(1) 这样做是否合适,有什么需要注意的地方?(比如我不担心并发问题,因为DataFrame是无状态和不可变的(这方面由应用程序来处理))。还有什么其他需要注意的呢?

(2) 一旦从hdf5文件加载到DataFrame中,如何缓存数据,以便不需要每次客户端请求都重新加载(至少是最近或最常用的DataFrame)。Flask(或者werkzeug)有一个SimpleCaching类,但它内部会将数据序列化并在访问时反序列化。我在想在我的特定情况下,这样做是否必要(假设缓存的对象是不可变的)。另外,这种简单的缓存方法在使用Gunicorn部署系统时可行吗(是否可以有静态数据(缓存),并且不同进程的并发请求可以访问同一个缓存)?

我知道这些问题很多,但在我投入更多时间构建一个概念验证之前,我想先在这里得到一些反馈。欢迎任何想法。

1 个回答

3

关于你问的几个方面,这里有一些回答:

从你的描述来看,不太清楚你是只有SQL数据库里的表,还是存储为HDF5文件,或者两者都有。需要注意的是,如果你使用的是Python 2.x,并通过pandas的HDFStore类创建文件,那么任何字符串都会被序列化,这样会导致文件变得比较大。你也可以直接通过SQL查询生成pandas的DataFrame,比如使用read_sql

如果你不需要进行任何关系型操作,我建议你可以放弃Postgre服务器。如果它已经设置好了,并且你将来可能会用到,那就继续使用SQL服务器。服务器的好处是,即使你不担心并发问题,它也会自动处理这些问题,使用(Flask-)SQLAlchemy可以让你少操心。一般来说,如果你将来打算添加更多的表(文件),有一个中央数据库服务器会比维护多个分散的文件更方便。

无论你选择哪种方式,Flask-Cache都会对你有帮助,可以使用memcachedredis作为后端。这样你就可以缓存返回准备好的DataFrame的函数,无论是来自SQL还是HDF5文件。重要的是,它还允许你缓存模板,这在显示大型表格时可能会有帮助。

当然,你也可以创建一个全局变量,比如在创建Flask应用时,然后在需要的地方导入它。我没有尝试过这种方法,所以不推荐。这样可能会引发各种并发问题。

撰写回答