數據科學家本地處理大中型數據的三種簡單方法
譯文【51CTO.com快譯】作為數據科學家,我們通常面臨龐大的數據集,少則幾千萬條記錄,多則幾億條記錄,可能有幾十列,甚至幾百列。這些數據通常以csv文件來接收,以多種方式來處理,最終目的是運行用Python或R編寫的復雜的機器學習算法。然而,這些數據不會裝入到RAM內存中,因此需要設計替代工具。
所有這些數據可以分配到一個集群中,并在集群中加以處理,但是這需要上傳文件這個繁瑣的過程,花費服務器時間方面的開銷,而且我們在處理敏感數據時擔心安全問題,需要相當復雜的編程方法,還要花時間來下載輸出結果。當然,總是可以創建本地的Spark會話,但學習曲線相當陡(意味著學起來困難),安裝對初學者來說是個難題(如果目標是偶爾處理幾個大文件,更是困難重重)。
我們在本文中著重介紹處理這種數據集的幾種簡單技術(包括安裝和運行)。
***種選擇:遍歷文件
你可以使用Python或R來快速遍歷文件。在本文中,我們將遍歷一個非常大的文件。數據集如下:5379074個觀測值和8列,有整數、日期和字符串,光盤上的文件大小是212 MB。
圖1
我們將生成一個類,用于處理這個文件。在這個類中,我們將定義兩個簡單的操作,***個操作是計算***值,第二個操作將過濾與特定名稱對應的記錄。在***三行中,我們為這個類創建實例,并使用其方法。
請注意:我們之所以沒使用pandas.read_csv,是因為這個數據集通常不會裝入到內存中(這取決于你的計算機)。另外請注意,我們排除了***條記錄,因為它含有文件頭。
圖2
問題是,在大多數實際情況下,就在我們偏離簡單的子集設置(sub-setting)操作的同一時刻,代碼的復雜性就會以驚人的方式增加。比如說,即使為一個使用文件的簡單的排序過程編寫代碼也非常復雜,更不用說處理缺失值、多變量類型和日期格式等問題了。更糟糕的是,大多數數據處理操作需要很好地實現排序過程:合并、置換和匯總不僅本身很困難,還總是要求經過排序的數據在合理的時間內運行。
第二種選擇:SAS
幾十年來,SAS一直是***的統計分析軟件。除了其出色的統計方法實現外,SAS還讓我們可以輕松處理數億個觀測值。它是通過使用硬盤來存儲數據做到這點的,而不是像大多數軟件那樣使用RAM內存來存儲數據。除此之外,這些文件可能有數千列。
SAS編程語言非常簡單而靈活。比如說,只要短短幾行代碼就可以實現讀取文件并進行排序:
- Data customer_data;
- infile “./sales.csv” lrecl=32767 missover;
- input User_id: 8. Salesman: $10. Date: mmddyy8. Customername: $10. City:$3. Country: $6.
- Discount: $9. Promo: 8.;
- run;
- proc sort data = customer_data;
- by User_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
原文標題:Simple Ways Of Working With Medium To Big Data Locally,作者:Francisco Juretig
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】