我必须解析一个巨大的列表(数百个)大的.csv文件(每个> 1Gb)来提取给定条件的切片。标准可能会随着时间而改变,因此它应该是可重复的。
我正在考虑使用三种不同的方法:
由于没有办法避免逐行读取文件,这在性能方面是哪三种最好的方法?还有更好的选择吗?
答案 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中进行分析。