Python多程式處理:如何將大量資料放入有限記憶體

Daetalus發表於2014-12-17

簡介

這是一篇有關如何將大量的資料放入有限的記憶體中的簡略教程。

與客戶工作時,有時會發現他們的資料庫實際上只是一個csv或Excel檔案倉庫,你只能將就著用,經常需要在不更新他們的資料倉儲的情況下完成工作。大部分情況下,如果將這些檔案儲存在一個簡單的資料庫框架中或許更好,但時間可能不允許。這種方法對時間、機器硬體和所處環境都有要求。

下面介紹一個很好的例子:假設有一堆表格(沒有使用Neo4j、MongoDB或其他型別的資料庫,僅僅使用csvs、tsvs等格式儲存的表格),如果將所有表格組合在一起,得到的資料幀太大,無法放入記憶體。所以第一個想法是:將其拆分成不同的部分,逐個儲存。這個方案看起來不錯,但處理起來很慢。除非我們使用多核處理器。

目標

這裡的目標是從所有職位中(大約1萬個),找出相關的的職位。將這些職位與政府給的職位程式碼組合起來。接著將組合的結果與對應的州(行政單位)資訊組合起來。然後用通過word2vec生成的屬性資訊在我們的客戶的管道中增強已有的屬性。

這個任務要求在短時間內完成,誰也不願意等待。想象一下,這就像在不使用標準的關係型資料庫的情況下進行多個表的連線。

資料

職位資料

referencenumber title postdate url company city state description
1652398203 Sales Associate 2014-07-09 13:47:18 URL link Company Name City State Our Sales Associates are…

“表格太長,請到原文檢視。”

標題資料

ID Title
82 Pediatricians, General

OES資料

area area_title area_type naics naics_title own_code 後略…
99 U.S. 1 000000 Cross-industry 1235 00-0000

“表格太長,請到原文檢視。”

SOC表

2010 SOC Code 2010 SOC Title 2010 SOC Direct Match Title llustrative Example
11-1011 Chief Executives CEO

示例指令碼

下面的是一個示例指令碼,展示瞭如何使用multiprocessing來在有限的記憶體空間中加速操作過程。指令碼的第一部分是和特定任務相關的,可以自由跳過。請著重關注第二部分,這裡側重的是multiprocessing引擎。

這裡發生了神奇的事情:

由於每個資料幀的大小都不同(總共約100Gb),所以將所有資料都放入記憶體是不可能的。通過將最終的資料幀逐行寫入記憶體,但從來不在記憶體中儲存完整的資料幀。我們可以完成所有的計算和組合任務。這裡的“標準方法”是,我們可以僅僅在“job_title_location_matcher”的末尾編寫一個“write_line”方法,但這樣每次只會處理一個例項。根據我們需要處理的職位/州的數量,這大概需要2天的時間。而通過multiprocessing,只需2個小時。

雖然讀者可能接觸不到本教程處理的任務環境,但通過multiprocessing,可以突破許多計算機硬體的限制。本例的工作環境是c3.8xl ubuntu ec2,硬體為32核60Gb記憶體(雖然這個記憶體很大,但還是無法一次性放入所有資料)。這裡的關鍵之處是我們在60Gb的記憶體的機器上有效的處理了約100Gb的資料,同時速度提升了約25倍。通過multiprocessing在多核機器上自動處理大規模的程式,可以有效提高機器的利用率。也許有些讀者已經知道了這個方法,但對於其他人,可以通過multiprocessing能帶來非常大的收益。順便說一句,這部分是skill assets in the job-market這篇博文的延續。

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

任選一種支付方式

Python多程式處理:如何將大量資料放入有限記憶體 Python多程式處理:如何將大量資料放入有限記憶體

相關文章