【干貨】將33G數(shù)據(jù)集轉(zhuǎn)為3G,這個(gè)案例值得學(xué)習(xí)
幾年前在StackOverflow上看到的一個(gè)問題,現(xiàn)在找不到了,當(dāng)時(shí)記錄了一點(diǎn)在草稿箱中
是個(gè)很好的學(xué)習(xí)案例,對于需要注意的地方也會進(jìn)行提示
當(dāng)加載數(shù)據(jù)集變大時(shí),我們的系統(tǒng)可能會卡頓崩掉,這個(gè)案例是將33G數(shù)據(jù)壓縮到了3.7G
依賴庫
pandas是常用的數(shù)據(jù)分析庫之一,用于數(shù)據(jù)處理等
垃圾收集器 (GC) ,在處理大量數(shù)據(jù)時(shí)從內(nèi)存中釋放空間,從內(nèi)存中刪除不需要的東西
glob 庫使用系統(tǒng)中的模式提取特定文件
os 庫與操作系統(tǒng)交互并處理文件及其路徑
分塊(chunk)
這里不能像處理小規(guī)模數(shù)據(jù)那樣直接加載數(shù)據(jù)文件,會導(dǎo)致崩潰
可以使用“chunksize”拆分文件,此處為每個(gè)塊選擇50萬行,可根據(jù)每個(gè)人任務(wù)&機(jī)器性能來定
這里‘gc.collect()’的使用非常巧妙且至關(guān)重要,可以避免內(nèi)存錯(cuò)誤
運(yùn)行后得到若干個(gè)chunk

然后查看是否可以讀取chunk并檢查信息

從打印輸出可以看出,190列中有185列是float64類型,這也是pandas 總是將 float 數(shù)據(jù)加載為 float64 的常見問題之一
通過優(yōu)化該部分,可以減少數(shù)據(jù)集中的一部分內(nèi)存
所以將其轉(zhuǎn)換為‘float16’或‘float32’以最小化內(nèi)存使用,這里將其轉(zhuǎn)換為“float16”
敲黑板了,請搞清楚你數(shù)據(jù)集這樣轉(zhuǎn)換是否會丟失數(shù)據(jù)精度?。?!

可以看到轉(zhuǎn)換為“float16”后,內(nèi)存使用量大大減少

優(yōu)化和拼接chunk文件
之前讀取并優(yōu)化了單個(gè)chunk文件,現(xiàn)在將拼接所有 23 個(gè)chunk文件并優(yōu)化內(nèi)存

使用‘glob’和‘os’ 方法訪問到相應(yīng)的文件,即(“*.csv”)
然后通過迭代讀取所有文件,在迭代過程中將其從‘float64’轉(zhuǎn)換為‘float16’并保存在列表中
緊接著將所有文件拼接保存在一個(gè)新的dataframe中

在dataframe中可以快速進(jìn)行數(shù)據(jù)處理
將dataframe轉(zhuǎn)換成文件格式
優(yōu)化后的dataframe可以轉(zhuǎn)換成任何文件格式
推薦feather,因?yàn)檩^為輕量,如下所示

讀取優(yōu)化后的文件
再次讀取優(yōu)化后的feather格式文件就不會出現(xiàn)任何內(nèi)存錯(cuò)誤
可以正常進(jìn)行數(shù)據(jù)處理操作

OK,完事,開擺