解析非常大的CSV数据集

时间:2017-05-10 07:32:31

标签: python python-2.7 csv pandas scikit-learn

我有一个非常大的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)操作)

还有其他更快的方法吗?

3 个答案:

答案 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)

在我看来,您可以使用dask

然后有same solution作为熊猫:

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