簡體   English   中英

減小 numpy 陣列的 memory 大小

[英]Reduce memory size for numpy array

我正在為深度學習創建窗口數據的數據集。 我將數據生成為 numpy arrays 4 arrays 形狀(141038、360)和形狀標簽的 1 個數組(141、308)。 我將 arrays 保存在 npz 文件中,但文件大小太大 1.5 GB。 我是 python 和編程新手,所以不知道文件大小應該有多大。 但是,我將 arrays 轉換為 Pandas 數據幀,並且 Memory 的使用在同一范圍內。 問題是我有 6 個 9 GB 的文件,可能還有另一個重疊的數據集,它是 7 倍大,所以它可能是 63 GB。

  • 這樣的文件大小是現實的還是我做錯了什么? (這只是一個帶有一些數字的文件而不是游戲)

  • 是否有另一種格式來保存我的 arrays 並減少 memory 的使用? (我嘗試了 HFD5,但文件大小相同)

  • 我嘗試更改數據類型,它略微減小了大小。 (3 arrays (f8), 1 (int8), 1 (uint8)) 是否還有其他數據類型可以進一步減小尺寸? 對於 0/1 值,是否有另一種數據類型比 (uint) 更有效?

  • 對於浮點 arrays 如果我降低精度,會有幫助嗎? 還是有另一種方法來減小它們的大小?

  • 我有一些用零填充填充的文件,一些用邊緣填充填充,另一些用插值填充。 但是所有文件幾乎都具有相同的大小,零填充的文件不應該具有較小的大小嗎?

  1. 是的,如果您使用的是浮點類型數據,那肯定是。

  2. 您可以嘗試numpy.savez_compressed保存為壓縮數組。

參考: https://docs.scipy.org/doc/numpy/reference/generated/numpy.savez_compressed.html

您也可以使用gzip ,但壓縮算法很重要。

import gzip
import numpy

f = gzip.GzipFile("x.npy.gz", "w")
numpy.save(file=f, arr=x)
f.close()

這可能有用: 高效壓縮 numpy arrays

  1. 對於二進制數據, uint8似乎很浪費。 事實上,您可以在一個uin8中存儲 8 個值 (0/1)。 只需將 0、1 視為位,您就可以通過簡單的二進制操作在單個uint8中編碼 8 位。

您可以使用“布爾”來存儲 0/1 值。

import numpy as np
import sys

b = np.array([0, 1, 0]*50000, dtype='b')

print(sys.getsizeof(b))

u8 = np.array([0, 1, 0]*50000, dtype='u8')

print(sys.getsizeof(u8))
150096
1200096
  1. 當然是。 如果您認為有損壓縮是一種選擇,您可以使用一個好的因子來壓縮數組。

  2. 沒關系,唯一重要的是形狀和數據類型。 Numpy arrays 未壓縮。 如果將其與圖像進行比較-那是錯誤的,類似“黑色圖像由於均勻性而具有較小的尺寸,因此零填充 arrays 應該消耗更少的空間”之類的類比是無關緊要的(圖像通常是有損壓縮的 JPEG)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM