未加星标

数据科学家本地处理大中型数据的三种简单方法

字体大小 | |
[大数据技术 所属分类 大数据技术 | 发布者 店小二04 | 时间 | 作者 红领巾 ] 0人收藏点击收藏
作为数据科学家,我们通常面临庞大的数据集,少则几千万条记录,多则几亿条记录,可能有几十列,甚至几百列。这些数据通常以csv文件来接收,以多种方式来处理,最终目的是运行用python或R编写的复杂的机器学习算法。然而,这些数据不会装入到RAM内存中,因此需要设计替代工具。
所有这些数据可以分配到一个集群中,并在集群中加以处理,但是这需要上传文件这个繁琐的过程,花费服务器时间方面的开销,而且我们在处理敏感数据时担心安全问题,需要相当复杂的编程方法,还要花时间来下载输出结果。当然,总是可以创建本地的Spark会话,但学习曲线相当陡(意味着学起来困难),安装对初学者来说是个难题(如果目标是偶尔处理几个大文件,更是困难重重)。
我们在本文中着重介绍处理这种数据集的几种简单技术(包括安装和运行)。
数据科学家本地处理大中型数据的三种简单方法

第一种选择:遍历文件

你可以使用Python或R来快速遍历文件。在本文中,我们将遍历一个非常大的文件。数据集如下:5379074个观测值和8列,有整数、日期和字符串,光盘上的文件大小是212 MB。

数据科学家本地处理大中型数据的三种简单方法

图1

我们将生成一个类,用于处理这个文件。在这个类中,我们将定义两个简单的操作,第一个操作是计算最大值,第二个操作将过滤与特定名称对应的记录。在最后三行中,我们为这个类创建实例,并使用其方法。
请注意:我们之所以没使用pandas.read_csv,是因为这个数据集通常不会装入到内存中(这取决于你的计算机)。另外请注意,我们排除了第一条记录,因为它含有文件头。
数据科学家本地处理大中型数据的三种简单方法

图2

问题是,在大多数实际情况下,就在我们偏离简单的子集设置(sub-setting)操作的同一时刻,代码的复杂性就会以惊人的方式增加。比如说,即使为一个使用文件的简单的排序过程编写代码也非常复杂,更不用说处理缺失值、多变量类型和日期格式等问题了。更糟糕的是,大多数数据处理操作需要很好地实现排序过程:合并、置换和汇总不仅本身很困难,还总是要求经过排序的数据在合理的时间内运行。

第二种选择:SAS

几十年来,SAS一直是最佳的统计分析软件。除了其出色的统计方法实现外,SAS还让我们可以轻松处理数亿个观测值。它是通过使用硬盘来存储数据做到这点的,而不是像大多数软件那样使用RAM内存来存储数据。除此之外,这些文件可能有数千列。
SAS编程语言非常简单而灵活。比如说,只要短短几行代码就可以实现读取文件并进行排序:
Datacustomer_data;
infile“./sales.csv”lrecl=32767missover;
inputUser_id:8.Salesman:$10.Date:mmddyy8.Customername:$10.City:$3.Country:$6.
Discount:$9.Promo:8.;
run;
procsortdata=customer_data;
byUser_id;
run;
日志文件是SAS一个经常被忽视的方面,但也是其最强大的功能之一。日志文件是一种功能极其强大的工具,可用于识别奇怪的观测值、缺失值和异常结果。比如说,将两个文件与数百万个观测值合并时,你只要查看多少观测值在两个文件中被读取、多少观测值作为输出被写入,立即就能发现问题。
你通常不会发现任何种类的限制或局限。不过遇到极其庞大的文件,使用分布式环境会来得更方便,使用在集群上运行的Spark(但这已在本文的讨论范围之外)。遗憾的是,SAS许可证通常相当昂贵,而且只能在计算机上运行。

第三种选择:nitroproc

nitroproc是一款免费的跨平台软件(目前适用于windows/MacOS/安卓/iOS),是为处理数据(专门面向数据科学家)而设计的。它可以借助Python或R,通过批处理模式来调用。与SAS类似,它旨在使用硬盘来存储数据,所以对数据大小几乎没有限制。其脚本可以部署到任何设备上,不用改变其语法(有待处理的正确的输入文件路径显然除外)。
我们在本文中将演示如何使用Windows版本和安卓版本(iOS版本也可以从App Store下载)。它可处理不同的变量类型、文件格式和缺失值。当前版本让你可以进行排序、合并、过滤、子集、计算虚拟变量、聚合及其他许多数据处理操作,这些过去是数据科学家所做的任务。
与SAS相似,nitroproc可以生成功能非常强大的日志,用于识别奇怪的数据和错误的合并等问题。另外,它还生成名为logtracer的另一个日志文件,用于逻辑分析脚本中的不同指令有怎样的关系。

按一个键排序540万个观测值

在这个例子中,我们将在PC和(旧)安卓手机中排序一个很大的文件,只是为了显示nitroproc的功能有多强大。我们将使用图1中所用的同一个数据集,即含有540万条记录的数据集。请记住,该数据集有5379074个观测值和8列,包含整数、日期和字符串,光盘上的文件大小是212MB。这里我们将按它的第一列(User_id)来排序。

你可以从https://www.nitroproc.com/download.html下载csv文件,复制我们在此处显示的相同结果。我在这里建议进行测试时,手机连接到PC/Mac,没有其他进程在后台运行。

语法很简单,我们只要写:

sort(file=sales.csv,by=[User_id],coltypes=[int,string,dd/mm/yyyy,string,string,string,int,int],order=[asc],outname=result.csv,out_first_row=true)
所有参数基本上不需要加以说明。order指定我们是否需要升序还是降序,out_first_row用于指定我们想不想要输出文件头。你可能注意到,我们没有指定任何文件头,因为csv已经包括文件头。如果不包含,我们需要输入headers=[colum_name1,…,column_namek]。针对PC,我们需要指定适当的文件路径,但如果是安卓和iOS版本,只需要文件名,因为文件路径会自动恢复(如果是安卓,使用/Downloads文件夹;如果是iPhone/iPad,使用App文件夹,它可以通过iTunes来访问)。
排序在nitroproc中来得特别重要,因为它用于合并文件、汇总文件及其他操作。

PC版本

在一台相当标准的(2012年)桌面英特尔i5-4430 @3.00 GHz和标准的希捷500GB ST500DM002硬盘上,排序用时1分25秒(请查看图3:nitroproc生成的日志文件,PC版本)完成。在最新的英特尔设备上,比如i7-4970k,并使用固态硬盘,脚本的运行速度至少快3倍(通过超频,可以达到更快的速度)。

数据科学家本地处理大中型数据的三种简单方法

图3

安卓版本

在装有安卓7.0 Nougat的Nexus上运行相同的脚本要慢得多(图4是nitroproc生成的日志文件,安卓版本,但仍可以顺畅无阻地运行)。这款手机是2015年发布的,采用1.8Ghz处理器(记住这不是一款高端手机)。如图1所示,用时15分钟。在最新的(2017年)高端安卓手机上,运行该脚本预计只要一半的时间(7分钟)。由于基本上没有使用RAM,nitroproc在RAM不足的系统中可以非常顺畅地运行。

数据科学家本地处理大中型数据的三种简单方法

图4

iOS版本

最后,看一下在iPhone 8 Plus(A11仿生芯片)上运行的iOS版本的结果。这些结果让我觉得惊讶。苹果声称,iPhone 8和X是有史以来最快的手机,但这可能是低调的说法。你可以看到,它在2分42秒内排序完文件,比我们的桌面英特尔CPU只慢了近一倍(记住PC的耗电量超过250瓦,而iPhone 8s在6.96瓦左右),但比普通的安卓手机几乎快5.5倍。对于iPhone 8 Plus(和使用相同芯片的iPhone X)来说一种更准确的说法是,它堪称工程奇迹,提供了与耗电量高出35倍的桌面游戏CPU相当的性能。要知道:nitroproc涉及非常密集的输入/输出操作,本文测试中涉及数亿次的写入和读取,因为有大量的中间操作。A11及其操作系统能够以如此快的速度从硬盘读取如此多的数据,这几乎是超现实的。

数据科学家本地处理大中型数据的三种简单方法

图5


数据科学家本地处理大中型数据的三种简单方法
主题: 数据iPhone硬盘iOSWindowsSparkCPU理大服务器iPad
分页:12
转载请注明
本文标题:数据科学家本地处理大中型数据的三种简单方法
本站链接:https://www.codesec.net/view/570440.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 大数据技术 | 评论(0) | 阅读(121)