数据科学家本地处理大中型数据的三种简单方法几十列,甚至上百列。这些数据通常以csv文件的形式接收并以多种方式处理,最终目标是运行用Python或R编写的复杂机器学习算法。但是,这些数据不会加载到RAM内存中,因此需要设计替代工具.所有这些数据都可以分布到集群中并在那里进行处理,但这需要上传文件的繁琐过程,服务器时间方面的开销,并且我们在处理敏感数据时担心安全性,需要相当复杂的编程方法,下载输出也需要时间。当然,创建本地Spark会话总是可行的,但是学习曲线相当陡峭(意味着很难学习),而且对于初学者来说安装可能很困难(如果目标是偶尔处理一些大文件则更难).在本文中,我们重点介绍了一些用于处理此类数据集的简单技术(包括设置和运行)。第一个选项:遍历文件您可以使用Python或R快速遍历文件。在本文中,我们将迭代一个非常大的文件。数据集如下:5379074个观察值和8列整数、日期和字符串,磁盘上的文件大小为212MB。图1我们将生成一个类来处理这个文件。在这个类中,我们将定义两个简单的操作,第一个操作是计算最大值,第二个操作将过滤特定名称对应的记录。在第三行,我们创建了这个类的一个实例并使用它的方法。请注意:我们没有使用pandas.read_csv因为这个数据集通常不适合内存(取决于您的计算机)。另请注意,我们排除了第一条记录,因为它包含文件头。图2的问题在于,在大多数实际情况下,代码的复杂性在我们偏离简单的子设置操作的同一点上以惊人的方式增长。例如,即使是使用文件的简单排序过程编写代码也非常复杂,更不用说处理缺失值、多变量类型和日期格式等问题了。更糟糕的是,大多数数据处理操作都需要一个实施良好的排序过程:合并、排列和汇总不仅本身很困难,而且总是需要排序后的数据在合理的时间内运行。第二种选择: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许可证通常非常昂贵,而且只能在计算机上运行。第三种选择:nitroprocNitroproc是一款免费的跨平台软件(目前可用于Windows/MacOS/Android/iOS),专为处理数据(专门为数据科学家设计)。它可以用Python或R以批处理方式调用。与SAS类似,它被设计为使用硬盘存储数据,因此对数据大小几乎没有限制。它的脚本可以部署到任何设备而无需更改其语法(显然正确的输入文件路径待定除外)。在本文中我们将演示如何使用Windows版本和Android版本(iOS版本也可以从AppStore下载)。它处理不同的变量类型、文件格式和缺失值。当前版本允许您排序、合并、过滤、子集、计算虚拟变量、聚合和许多其他数据操作操作,这些操作曾经是数据科学家的任务。与SAS类似,nitroproc可以生成非常强大的日志,用于识别奇怪数据和错误合并等问题。此外,它还会生成另一个名为logtracer的日志文件,用于从逻辑上分析脚本中不同指令之间的关联。通过一个键对540万个观察结果进行排序在这个例子中,我们将在PC和(旧的)Android手机中对一个非常大的文件进行排序,只是为了展示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,我们需要指定相应的文件路径,但是对于Android和iOS版本,只需要文件名,因为文件路径会自动恢复(对于Android,使用/Downloads文件夹;对于iPhone/iPad,使用App文件夹,可通过iTunes访问)。排序在nitroproc中尤为重要,因为它用于合并文件、汇总文件和其他操作。相当标准(2012)台式机Inteli5-4430@3.00GHz和标准Seagate500GBST500DM002硬盘上的PC版本排序用了1分25秒(见图3:nitroproc生成的日志文件,PC版本)完成。在现代Intel设备上,例如i7-4970k,并使用SSD,脚本运行速度至少快3倍(通过超频,可以实现更快的速度)。图3Android版本在装有Android7.0Nougat的Nexus上运行相同的脚本要慢得多(图4是nitroproc生成的日志文件,Android版本,但仍然运行流畅无阻碍)。这款手机于2015年发布,配备1.8Ghz处理器(请记住这不是高端手机)。如图1所示,耗时15分钟。在最新的(2017)高端Android手机上,运行脚本预计需要一半的时间(7分钟)。由于基本不使用RAM,nitroproc在RAM不足的系统上也能非常流畅的运行。图4iOS版本***,看iOS版本在iPhone8Plus(A11Bionic芯片)上运行的结果。这些结果让我很吃惊。Apple声称iPhone8和X是有史以来最快的手机,但这可能是轻描淡写的说法。你可以看到它在2分42秒内对文件进行了排序,这只比我们的台式机IntelCPU慢了将近两倍(记住PC消耗超过250瓦,而iPhone8s约为6.96瓦),但几乎是5.5倍比普通的Android手机更快。更准确地说,iPhone8Plus(以及使用相同芯片的iPhoneX)是一个工程奇迹,其性能可与功耗高出35倍的台式机游戏CPU媲美。请注意:nitroproc涉及非常密集的输入/输出操作。这篇文章的测试涉及数亿次写入和读取,因为有大量的中间操作。A11及其操作系统可以如此快速地从硬盘读取如此多的数据,这几乎是超现实的。图5原标题:SimpleWaysOfWorkingwithMediumtoBigDataLocally,作者:FranciscoJuretig
