解析一个非常大的 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()
如果您还想要所有ActivityId
s,请使用.drop_duplicates()
:
df[['URL','ActivityId']].drop_duplicates()
【讨论】:
【参考方案3】:首先,您必须清楚自己的要求。如果您有 900 MB 的数据;并且您打算将所有这些数据推送到一个字典中 - 那么您应该不会惊讶地发现您最终需要 900 MB 的 RAM。
换句话说:如果要同时处理内存中的所有数据,则所有数据都需要在内存中。
为了加快处理速度:我会先进入并排序您的 CSV 输入(在 URL 列上);例如使用awk。现在您可以逐行读取该文件;但是您知道所有具有相同 URL 的行都将显示为“块”。含义:现在您不需要读取内存中的所有 URL;您可以一个接一个地处理它们。
【讨论】:
以上是关于解析一个非常大的 CSV 数据集的主要内容,如果未能解决你的问题,请参考以下文章
将非常大的 CSV 数据集加载到 Python 和 R 中,Pandas 陷入困境