处理大型数据集 python
使用当今个人台式机或笔记本电脑的标准 RAM 量(通常为 8Gb 或更多),处理 4Gb 内存应该没有什么问题。如果您的硬件设置内存不足,并且您的 ML 算法使您的 SO 开始分页,那么最好的提示是使用不复制数据的算法和设置,而是在适当的位置完成所有操作。
在pandas中,许多操作都提供了一个精确调用的布尔参数inplace来控制这种行为,例如DataFrame.reset_index。Numpy还支持就地操作,例如sort。
考虑到:
inplace=True不保证操作实际执行到位,它只是一个提示,可能会或可能不会兑现。- 对于一些操作。
inplace=True可能会降低性能,例如dropna.
综上所述,根据我的经验,inplace=True实际上内存消耗有所不同,可用于避免分页,从而使计算能够完全在 RAM 中进行,以用于像您这样的数据集。
最后,注意inplace默认值。如熊猫文档中的此警告所述:
警告:为了向后兼容,如果未指定,就地默认为 True。这将在熊猫的未来版本中发生变化 - 如果您的代码依赖于就地分配,您应该更新以显式设置 inplace=True
至少有两种简单的方法可以处理这个问题。如果您的数据有很多零等,则可能值得尝试将其加载为sparse dataframe。
始终有效的一件事是以迭代方式处理您的数据。对于大多数数据类型,pandas 可以让您遍历文件,例如使用pandas.read_csv(data, iterator=True). 这不适用于 JSON 数据,但您可以改用该ijson包。
许多 scikit-learn 算法也可以一次在一个或几个样本(小批量)上进行迭代训练。特别是具有随机梯度下降的灵活线性模型(SGDClassifier 和 SGDRegressor)。对于集群,您可以使用MiniBatchKMeans。您可以在文档中阅读有关此内容的更多信息。
如果您的数据几乎适合内存,您可以尽可能多地读入。如果其中大部分不适合,则可能无法在不进行一些调整的情况下让您使用 pandas/sklearn。
您可以做的一件事是在使用 dtypes 选项加载数据集时显式设置类型,即 (... dtype={'ORDER NO': np.int32, 'CUSTOMER': str} ...) - 这可能会节省内存当您加载文件时。