我对运行转换,加载数据和Pandas
的易用性的速度印象深刻,并希望利用所有这些不错的属性(以及其他)来模拟一些大型数据集(〜 100-200k行,<20列)。目的是使用某些计算节点上的数据,还可以通过Flask
在浏览器中提供数据集视图。
我目前正在使用Postgres数据库来存储数据,但数据的导入(来自csv文件)是缓慢,繁琐和容易出错的,并且数据从数据库中获取并处理它不是更容易。导入后数据永远不会被更改(没有CRUD操作),所以我认为将它存储为几个pandas DataFrame
(以hdf5格式存储并通过pytables加载)是理想的。
问题是:
(1)这是一个好主意,有什么需要注意的事项? (例如,我不期待并发问题,因为DataFrame
(应该?)是无状态和不可变的(从应用程序端处理))。还有什么需要注意的?
(2)一旦将数据从hdf5文件加载到DataFrame
,我将如何缓存数据,因此不需要为每个客户端请求加载数据(在至少最近/频繁的数据帧)。 Flask
(或werkzeug
)有一个SimpleCaching
类,但在内部,它会在访问时挑选数据并取消激活缓存的数据。我想知道在我的特定情况下是否有必要(假设缓存的对象是不可变的)。此外,当系统与Gunicorn一起部署时,是否可以使用这种简单的缓存方法(是否可以拥有静态数据(缓存)并且可以并发(不同进程?)请求访问同一缓存?)。
我意识到这些问题很多,但在我投入更多时间并构建概念验证之前,我想我在这里得到了一些反馈。欢迎任何想法。
答案 0 :(得分:3)
回答您所要求的某些方面:
从您的描述中,您是否仅在SQL数据库中存储表,存储为HDF5文件或两者都不是很清楚。需要注意的是,如果你使用Python 2.x并通过pandas的HDFStore类创建文件,那么任何字符串都会被腌制,从而导致相当大的文件。您也可以使用read_sql
直接从SQL查询生成pandas DataFrame。
如果您不需要任何关系操作,那么我会说放弃postgre服务器,如果它已经设置好了,您将来可能需要继续使用SQL服务器。关于服务器的好处是,即使你不期望并发问题,它也会自动处理你使用(Flask-)SQLAlchemy让你不那么头痛。一般来说,如果您希望添加更多表(文件),那么拥有一个中央数据库服务器比维护多个文件更不成问题。
无论您采用哪种方式,Flask-Cache都将成为您的朋友,使用memcached
或redis
后端。然后,您可以缓存/记忆从SQL或HDF5文件返回准备好的DataFrame的函数。重要的是,它还允许您缓存可能在显示大表中起作用的模板。
当然,您也可以生成一个全局变量,例如,您可以在其中创建Flask应用程序,只需将其导入到需要的任何位置即可。我没试过这个,所以不推荐它。它可能会导致各种并发问题。