处理巨大.csv的最佳方法

时间:2017-10-11 20:39:36

标签: python-3.x sqlite pandas csv pivot-table

我需要使用Python处理一个相当大的.css(至少1000万行,数百列)。我想:

  1. 根据多个条件(主要是字符串,可能是一些正则表达式)过滤内容
  2. 合并过滤后的数据。例如,按日期对它们进行分组,并根据特定的标准对每个日期进行计数。非常类似于数据透视表可以做的事情。
  3. 我想要用户友好地访问该合并数据
  4. 我想生成图表(主要是基本折线图)
  5. 处理必须快速且清晰,因为工作中的计算机无法处理太多而我们总是匆忙
  6. 鉴于这些先决条件,您能否提出一些建议?我想过用熊猫。我还考虑过将csv转储到SQLite数据库中(因为如果我编写用户界面,可能更容易查询)。但这是我第一次涉足这个世界,所以我不知道从哪里开始。我没有太多时间,但如果你能提供一些建议,一些好的(和新的)东西等等,有趣的库等等,我会很高兴的。很抱歉,如果Stackoverflow不是要求此类帮助的最佳位置。如果需要,我会删除帖子。问候。

2 个答案:

答案 0 :(得分:1)

有两种不同的情况:

  • 当您的报告(图表,数据透视表)使用来自orignal CSV的有限数量的列时,您只能将大型CSV文件预聚合一次以获得更小的数据集。这种一次性处理可能需要一些时间(分钟),并且不需要将整个CSV加载到内存中,因为它可以作为数据流(逐行)处理。之后,您可以使用此小数据集进行快速处理(过滤,分组等)。
  • 您不知道哪些原始CSV列可用于分组和过滤,并且无法进行预聚合。换句话说,所有10M行应该实时处理(非常快) - 这是OLAP用例。如果您将CSV数据加载到内存中一次,然后在需要时快速迭代超过10M行,则可以执行此操作;如果这不可能,则只有选项是将其导入数据库。 SQLite是一个很好的轻量级数据库,您可以轻松地import CSV with sqlite3命令行工具。请注意,10M行的SQL查询可能不会那么快,您可能需要添加一些索引。

另一种选择可能是使用专门的OLAP数据库,如Yandex ClickHouse - 您可以使用它直接使用SQL查询CSV文件(table engine = FILE)或将CSV导入其列存储。使用GROUP BY查询时,此数据库非常快速(它可以在< 1s中处理10M行)。

答案 1 :(得分:1)

xsv一个机会。速度适中,非常方便。它适用于Unix哲学。但是,如果数据集的使用次数超过十次,我建议将csv转换为某种二进制格式,而ClickHouse则是一个很好的选择。