【问题标题】:Parse a very large CSV dataset解析一个非常大的 CSV 数据集
【发布时间】: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) 操作)

还有其他更快的方法吗?

【问题讨论】:

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


    【解决方案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;您可以一个接一个地处理它们。

      【讨论】:

        猜你喜欢
        • 2017-07-08
        • 2013-01-11
        • 2015-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多