我有一个非常大的CSV数据集(900M记录),它由以下格式组成:
URL | IP | ActivityId
示例数据:
http://google.com/ | 127.0.0.1 | 2
http://google.com/ | 12.3.3.1 | 2
对于这种格式,我希望获得每个URL的所有独特活动。
我尝试做的是创建一个字典,其中键是URL,值是一组唯一的活动。然而,这在性能方面失败了 - 它占用了所有RAM并且时间非常慢(O(n)操作)
还有其他更快的方法吗?
答案 0 :(得分:0)
我假设您实际上已经将数据集加载到内存中(让我们说它存储在名为df
的变量中),并在您遇到麻烦时遇到麻烦我试图获得每个网址的所有独特活动"。
如果您只想要每个网址的唯一活动数量,请使用.groupby()
方法:
df.groupby('URL').ActivityId.nunique()
如果您还想要所有ActivityId
,请使用.drop_duplicates()
:
df[['URL','ActivityId']].drop_duplicates()
答案 1 :(得分:0)
首先,您必须明确自己的要求。如果你有900 MB的数据;并且您打算将所有数据推送到单个字典中 - 然后您不应该惊讶地发现最终需要900 MB的RAM。
换句话说:如果你想同时处理内存中的所有数据,所有数据都需要在内存中。
为了加快处理速度:我会首先进入排序您的CSV输入(在网址列上);例如使用awk。现在你可以逐行读取该文件;但是你知道所有具有相同URL的行都将显示为“块”。含义:现在您不需要读取内存中的所有 URL;你可以一个接一个地处理它们。
答案 2 :(得分:0)