使用 pandas 解析 csv 与将数据存储在数据库(sqlite 或 mssql)中

parse csv with pandas vs storing data in a database (sqlite or mssql)

我必须解析一个巨大的列表(数百个)大 .csv 文件(每个 >1Gb)以提取给定条件的切片。标准可能会随着时间而改变,因此它应该是可重现的。

我正在考虑使用三种不同的方法:

既然无法避免逐行读取文件,那么就性能而言,这三种方法中哪种方法最好?还有更好的选择吗?

使用 SQL 数据库将 "slow" 您的查询,因为此内容不驻留在您的 RAM 中,但随着数据变大,其可扩展性会更高。它还允许您将数据托管在不同的计算机上,这样您就不必共享计算 power/can 使用云服务。

一开始,您选择可以最快获得结果的方式。

根据您的问题,我假设您熟悉 pandas;如果是这样的话,你将能够快速实施它,并且它也将表现良好。

构建长期解决方案意味着您需要平衡重新处理原始数据的需求(这种情况多久发生一次?)与查询 'output',并考虑结果中的比例输出。提取切片并存储 re-use 的结果是有意义的,但前提是 re-use 存在。如果这些切片很少 re-use,并且条件经常更改,那么您可能只想在每次查询数据时重新处理。

Since there's no way to avoid reading the files row-by-row

虽然这在某种程度上是正确的,但您的代码可能没有必要处理源文件 RBAR。您可以想象使用类似 SQL 服务器的 bcp 实用程序(或 SQLite 等效项)将行转储到数据库中,然后将您需要的 "slices" 提取到 pandas 进行分析。

经过一些测量,我决定使用混合方法:

事实:

  • 使用相同的硬件和数据集,pandas过滤大文件比查询相同数据集的sqlite3和mssql数据库引擎快约20%,差距增长速度与数据集增长。

  • 另一方面,将输出存储在数据库中的速度提高了大约 50%,并且对硬盘的需求更少 space。

所以我最终使用 pandas read_csv 来处理输入(手动调整块的大小,直到我找到最好的 size/performance 比率,每个块大约 200k 行)和使用 sqlalchemy 仅将相关数据存储在 sqlite3 中。然后将通过对数据库的查询或再次使用 pandas 来执行流程中的未来改进。