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

时间:2018-03-28 19:41:45

标签: python pandas csv sqlite pyodbc

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

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

  • 好老猫| grep。最后,但如果我想整个过程自动化,则不可行。
  • 使用panda的csv读取函数加载并迭代每个文件,并仅在新的csv文件中保留匹配的行。 Example
  • 导入数据库中的每一行并按需查询,最好是sqlite,但可以是MS SQL。 Example

由于没有办法避免逐行读取文件,这在性能方面是哪三种最好的方法?还有更好的选择吗?

4 个答案:

答案 0 :(得分:1)

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

根据你的问题,我假设你熟悉大熊猫;如果是这种情况,您将能够快速实施它,并且它也将表现良好。

构建长期解决方案意味着您需要平衡重新处理原始数据的需求(这种情况经常发生的频率?)与查询“输出”,并考虑输出中结果的比例。提取切片并存储结果以便重复使用是有意义的,但前提是存在重复使用。如果几乎没有重复使用这些切片,并且标准经常更改,那么您可能只想在每次查询数据时重新处理。

答案 1 :(得分:1)

在进行一些测量后,我决定使用混合方法:

事实:

  • 使用相同的硬件和数据集,pandas比sqlite3和mssql数据库引擎查询同一数据集的过滤大文件快20%,这个差距随着数据集的增长而增加。

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

所以我最终使用pandas read_csv处理输入(手动调整块的大小,直到我找到每块大约200k行的最佳大小/性能比)并使用sqlalchemy仅存储sqlite3中的相关数据。然后,可以通过对db的查询或再次使用pand来执行该过程中的未来改进。

答案 2 :(得分:0)

使用SQL数据库"慢"您的查询,因为此内容不驻留在您的RAM中,但随着数据变大,它将更具可伸缩性。它还允许您在不同的计算机上托管数据,因此您不必共享计算能力/可以使用云服务。

答案 3 :(得分:0)

  

因为没有办法避免逐行读取文件

虽然在某种程度上确实如此,但您的代码可能没有必要处理源文件RBAR。您可以想象使用SQL Server的bcp实用程序(或SQLite等价物)之类的东西将行转储到数据库中,然后将所需的“切片”提取到pandas中进行分析。