使用 pandas 解析 csv 与将数据存储在数据库(sqlite 或 mssql)中
parse csv with pandas vs storing data in a database (sqlite or mssql)
我必须解析一个巨大的列表(数百个)大 .csv 文件(每个 >1Gb)以提取给定条件的切片。标准可能会随着时间而改变,因此它应该是可重现的。
我正在考虑使用三种不同的方法:
- 好老猫|grep。最后的手段,但如果我想使整个过程自动化的话,随着时间的推移不可行。
- 使用 panda 的 csv 读取功能加载和迭代每个文件,并仅将匹配的行保留在新的 csv 文件中。 Example
- 导入数据库中的每一行并按需查询,最好是 sqlite,但也可以是 MS SQL。 Example
既然无法避免逐行读取文件,那么就性能而言,这三种方法中哪种方法最好?还有更好的选择吗?
使用 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 来执行流程中的未来改进。
我必须解析一个巨大的列表(数百个)大 .csv 文件(每个 >1Gb)以提取给定条件的切片。标准可能会随着时间而改变,因此它应该是可重现的。
我正在考虑使用三种不同的方法:
- 好老猫|grep。最后的手段,但如果我想使整个过程自动化的话,随着时间的推移不可行。
- 使用 panda 的 csv 读取功能加载和迭代每个文件,并仅将匹配的行保留在新的 csv 文件中。 Example
- 导入数据库中的每一行并按需查询,最好是 sqlite,但也可以是 MS SQL。 Example
既然无法避免逐行读取文件,那么就性能而言,这三种方法中哪种方法最好?还有更好的选择吗?
使用 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 来执行流程中的未来改进。