解析一个非常大的 CSV 数据集

Posted

技术标签:

【中文标题】解析一个非常大的 CSV 数据集【英文标题】:Parse a very large CSV dataset 【发布时间】:2017-10-08 17:30:09 【问题描述】:

我有一个非常大的 CSV 数据集(9 亿条记录),包含以下格式:

URL | IP | ActivityId

示例数据:

http://google.com/ | 127.0.0.1 | 2
http://google.com/ | 12.3.3.1 | 2

对于这种格式,我希望获取每个 URL 的所有唯一活动。

我尝试创建一个字典,其中键是 URL,值是一组独特的活动。但是,这在性能方面非常失败 - 它耗尽了所有 RAM 并且在时间方面非常缓慢(O(n) 操作)

还有其他更快的方法吗?

【问题讨论】:

【参考方案1】:

我认为你可以使用dask。

然后有same solution作为熊猫:

df.groupby('URL')['ActivityId'].nunique()

【讨论】:

如何选择那些仅对给定 URL 唯一且不出现在其他 URL 中的活动? 比较复杂,不知道dask是否支持。但是给我一点时间,我会试着找到解决办法。 这真的很难,也许更好的是发布带有示例和所需输出的新问题,还有一些你尝试的代码。现在我没有解决方案:( 将在 50 分钟内完成 :) 我所做的是将 dic 中的每个条目相互比较,并用两组的差异更新第一个条目的集合。但是由于我不能使用 dic 数据结构,我需要另找方法。【参考方案2】:

我假设您实际上已经将数据集加载到内存中(假设它存储在名为 df 的变量中),当您尝试“获取每个 URL 的所有唯一活动”时遇到了麻烦。

如果您只需要每个 URL 的唯一活动数,请使用 .groupby() 方法:

df.groupby('URL').ActivityId.nunique()

如果您还想要所有ActivityIds,请使用.drop_duplicates()

df[['URL','ActivityId']].drop_duplicates()

【讨论】:

【参考方案3】:

首先,您必须清楚自己的要求。如果您有 900 MB 的数据;并且您打算将所有这些数据推送到一个字典中 - 那么您应该不会惊讶地发现您最终需要 900 MB 的 RAM。

换句话说:如果要同时处理内存中的所有数据,则所有数据都需要在内存中。

为了加快处理速度:我会先进入并排序您的 CSV 输入(在 URL 列上);例如使用awk。现在您可以逐行读取该文件;但是您知道所有具有相同 URL 的行都将显示为“块”。含义:现在您不需要读取内存中的所有 URL;您可以一个接一个地处理它们。

【讨论】:

以上是关于解析一个非常大的 CSV 数据集的主要内容,如果未能解决你的问题,请参考以下文章

将非常大的 CSV 数据集加载到 Python 和 R 中,Pandas 陷入困境

删除非常大的数据集上的重复项

如何在 RNN TensorFlow 中使用非常大的数据集?

将 CSV 解析为数据网格 WinForms

按年份过滤大型数据集

处理非常大的数据集并及时加载