使用Pandas处理大型数据—节省90%内存的建议

来源:互联网 发布:中国网络墙 编辑:程序博客网 时间:2024/05/23 00:01

    看到一篇关于如何有效利用Pandas节省内存的文章,很有收获,原文地址:Using pandas with large data—Tips for reducing memory usage by up to 90%。

     简要总结一下这篇文章的中心思想:合理设计读取的数据类型。下图是从原文中截取出来的,可以看到Pandas中不同数据类型所占用的内存。


    作者建议,在不影响数据准确的情况下,将float64转换为float32,将int64转换为int32,对于没有负数的整数列转换为uint类型。

    然而,能够比较显著减少内存占用的是将object转换为category。一般来说,Pandas将字符串存储为object类型,字符串的占用内存较大。如果将字符串转换为对应的整数,那么就会极大的减少内存占用。例如,假设有一列数据是week_day,内容为中文字符“星期一,星期二……星期日”,转换为category之后week_day变为1-7的整数,其中星期一—1,星期二—2,……星期日—7。这样字符串就转换为整数,Pandas也会将对应关系存储起来。作者也同时建议,object转换为category适用于类别比较少的情况,如果一列数据的每一行字符串都是唯一的,或者大部分是唯一的,那么就不适合转换,转换之后的内存占用甚至可能大于转换之前。因为Pandas不仅存储数据,还存储对应关系,如果一列数据中字符串都是唯一的,那么实际上并没有节省任何内存。

    最后,所有类型的转换都有现成的方法可以使用,不必自己实现。关于更加细节的内容,以及相关代码,请各位阅读原文,在文章的开头有原文链接。

   从作者的整体思路可以看出,Pandas节省内存和数据库节省硬盘差不多,都始于合理的数据类型设计。其实无论是数据挖掘还是机器学习,所有的字符串类型都会转换为int或者float,这一步处理几乎是必然的。如果仅仅做数据分析或者数据探索,那么这种转换并不是一定要做的,但好处是会大大加速程序运行的速度,所以如果你的数据量很大或者计算机性能不是很强的话,做一些转换还是很有必要的。