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

译文
大数据
作为数据科学家,我们通常面临庞大的数据集,少则几千万条记录,多则几亿条记录,可能有几十列,甚至几百列。这些数据通常以csv文件来接收,以多种方式来处理,最终目的是运行用Python或R编写的复杂的机器学习算法。

【51CTO.com快译】作为数据科学家,我们通常面临庞大的数据集,少则几千万条记录,多则几亿条记录,可能有几十列,甚至几百列。这些数据通常以csv文件来接收,以多种方式来处理,最终目的是运行用Python或R编写的复杂的机器学习算法。然而,这些数据不会装入到RAM内存中,因此需要设计替代工具。

所有这些数据可以分配到一个集群中,并在集群中加以处理,但是这需要上传文件这个繁琐的过程,花费服务器时间方面的开销,而且我们在处理敏感数据时担心安全问题,需要相当复杂的编程方法,还要花时间来下载输出结果。当然,总是可以创建本地的Spark会话,但学习曲线相当陡(意味着学起来困难),安装对初学者来说是个难题(如果目标是偶尔处理几个大文件,更是困难重重)。

我们在本文中着重介绍处理这种数据集的几种简单技术(包括安装和运行)。

[[215741]]

***种选择:遍历文件

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

本地处理大中型数据的若干简单方法

图1

我们将生成一个类,用于处理这个文件。在这个类中,我们将定义两个简单的操作,***个操作是计算***值,第二个操作将过滤与特定名称对应的记录。在***三行中,我们为这个类创建实例,并使用其方法。

请注意:我们之所以没使用pandas.read_csv,是因为这个数据集通常不会装入到内存中(这取决于你的计算机)。另外请注意,我们排除了***条记录,因为它含有文件头。

本地处理大中型数据的若干简单方法

图2

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

第二种选择:SAS

几十年来,SAS一直是***的统计分析软件。除了其出色的统计方法实现外,SAS还让我们可以轻松处理数亿个观测值。它是通过使用硬盘来存储数据做到这点的,而不是像大多数软件那样使用RAM内存来存储数据。除此之外,这些文件可能有数千列。

SAS编程语言非常简单而灵活。比如说,只要短短几行代码就可以实现读取文件并进行排序:

  1. Data customer_data;  
  2. infile “./sales.csv” lrecl=32767 missover;  
  3. input User_id: 8. Salesman: $10. Date: mmddyy8. Customername: $10. City:$3. Country: $6.  
  4. Discount: $9. Promo: 8.;  
  5. run;  
  6. proc sort data = customer_data;  
  7. by User_id;  
  8. 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,没有其他进程在后台运行。

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

  1. sort(file = sales.csv,by = [User_id],coltypes = [int,string,dd / mm / yyyy,string,string,string,intint],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

原文标题:Simple Ways Of Working With Medium To Big Data Locally,作者:Francisco Juretig

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

责任编辑:未丽燕 来源: 51CTO.com
相关推荐

2017-08-04 15:53:10

大数据真伪数据科学家

2017-01-23 16:00:25

数据科学家大数据数学家

2016-05-11 10:36:16

数据科学家数据科学大数据

2010-01-31 10:47:11

2010-09-27 11:16:35

2019-06-05 15:17:45

2019-07-30 12:05:20

数据科学采样算法

2016-09-22 14:28:33

数据科学家算法

2010-09-17 19:52:57

2012-12-26 10:51:20

数据科学家

2018-12-24 08:37:44

数据科学家数据模型

2020-09-04 16:17:15

数据科学离群点检测

2018-02-28 15:03:03

数据科学家数据分析职业

2021-08-31 10:51:34

UPS电源环境

2009-09-08 10:37:57

C#遍历CheckBo

2021-09-14 09:13:38

UPS电源安装供电系统

2018-03-27 11:02:55

2018-10-16 14:37:34

数据科学家数据分析数据科学

2015-08-25 13:20:29

数据科学

2020-03-20 14:40:48

数据科学Python学习
点赞
收藏

51CTO技术栈公众号