不是每个人都拥有一台超级计算机,那么如何利用一台普通计算机处理大数据?当数据大小超过你计算机的内存,这时不能一次性把大数据写入内存里,否则会产生内存溢出。大多数机器学习算法都是基于内存,即原始数据以及过程数据都保存在内存,这给普通计算机处理大数据造成困难。通过本文的学习,你将学会如何利用普通计算机处理大数据。本文主要讨论如何用python生成器处理大数据。
普通计算机处理大数据思想是:将大数据分为几批,依次处理每一批数据,最后综合各个批次的处理结果。有关python生成器的概念请参考我的文章《如何理解python中的生成器?》。生成器的特点是依次不重复地生成数据,符合大数据处理思想,因此利用python生成器处理大数据是一种很自然的想法。
利用生成器,在普通计算机里也可以进行深度学习,比如要训练一个深度神经网络,可以采取批次训练方法,对每一个批次,利用生成器从硬盘里提取一个批次的数据,并不需要把所有数据加载到内存里,对于训练过程以及结果,相应地也可以采取批次方法将结果保存到硬盘里,唯一要做的是重写代码。
本文提供一个简单案例,统计自然常数e的41万位小数点的数字0-9出现的次数,展示python生成器,在不需要将数据写入内存的情况下,如何批次处理大数据。处理思想就是把41万位小数点依次划分为41批次,每个批次的长度10000位,统计每个批次的数字0-9出现的次数,然后汇总统计所有批次的次数。(读者可以尝试用1000万位小数点在一个内存为1g的普通计算机里处理,比较一下普通方法(参考文章《机器学习实战:用python分析自然常数e的小数点数字出现规律》)和本文方法的效果)
1.数据
原始数据共4100行数据,每行有100位小数点,共41万位小数点,其中第1列数据为标注,需要去掉。数据文件名为e.txt,保存在python项目目录下。
原始数据2.构造生成器
构造一个生成器gen,用于每次从原始文件e.txt中读取一行数据。目前该生成器并没有真正读取文件,是一个机器,没启动它之前(使用内置方法next()启动它),在python中只是一个符号,占用内存微不足道。另外优点是,该生成器并没有打开文件对象。
构造生成器gen3.定义批处理函数
利用生成器gen一次性从原始文件读取bat_number行数据(一个批次),然后将bat_number行数据转化为列表e,接着是数据预处理,比如去掉符号“\n”和空格,最后将处理后的数据转化为pandas的序列数据结构。即通过批处理函数batch(),能一批次从原始文件读取bat_number行数据,并最终转化为pandas的序列数据。值得注意的是,由于生成器的特点,运行批处理函数batch()两次,就得到两批次的数据,而且第2批次的数据是接着第1批次的数据依次产生,因此不重复。
批处理函数4.定义统计函数
利用批处理函数batch()获取一个批次的数据,并统计数字的出现次数,然后遍历所有批次,得到数字出现次数的列表。
统计函数5.运行结果及可视化展示
作为例子,运行主程序,汇总统计数字“9”的出现次数,并绘制每个批次出现次数的曲线图。代码如下:
主程序代码可视化:
各个批次的次数曲线图运行结果如下:
运行结果6.总结
本文展示了如何利用python生成器处理大数据的全过程。所使用的方法是通用的,可以应用于机器学习、深度学习等领域。即使你没有超级计算机,也没有分布式大数据处理系统,只要你选择合适的算法、合适的数据结构和合适的工具(python生成器),你只有一台普通计算机也可以处理大数据。
(作者:百家号/aimath)