2017-06-19 62 views
0

我有一個巨大的csv文件,無法加載到內存中。將其轉換爲libsvm格式可能會節省一些內存。 在csv文件中有許多南。如果我讀取行並將它們存儲爲np.array,並將np.nan作爲NULL,那麼數組是否仍佔用太多內存? 數組中的np.nan是否也佔用內存?numpy數組中的np.nan是否佔用內存?

+1

*數組中的np.nan是否也佔用內存?* numpy數組是一種同類固定大小的記錄數據結構,即爲每個元素分配相同數量的內存(例如, float32「和8個字節)。 'numpy.nan'僅由一個特殊(保留)位模式表示。 – Leon

+0

Numpy數組是連續的(假設C排序並且沒有轉置)內存塊。無論您在其上存儲什麼,它都會佔用與其形狀和數據類型相當的空間。 Scipy有稀疏的矩陣,可以用來忽略nans。 –

+0

您可能會發現這[問題](https://stackoverflow.com/questions/1938894/csv-to-sparse-matrix-in-python)有用,它從CSV構造一個稀疏的scipy矩陣。 –

回答

2

據我所知是的,南與零個值佔用相同的內存爲任何其他值,但是,可以通過其他方式解決你的問題:

您是否嘗試過使用稀疏向量?它們用於向量有很多0值和內存佔用優化

SVM Module Scipy

Sparse matrices Scipy

有你有關於SVM和稀疏矩陣一些信息,如果您還有其他問題,只問。

編輯,以提供一個答案,以及一個溶液

+0

我應該使用哪個軟件包? scipy?任何例子?謝謝。 – yanachen

+0

我不確定稀疏矢量是否會支持xgboost。因爲我的目標是訓練模型。 – yanachen

+0

除非您的學習/培訓代碼明確說明您可以,否則不要使用稀疏矩陣代碼。一些scikit學習方法。 – hpaulj

1

根據來自sys模塊它的getsizeof()命令。一個簡單而快速的例子:

import sys 
import numpy as np 

x = np.array([1,2,3]) 
y = np.array([1,np.nan,3]) 

x_size = sys.getsizeof(x) 
y_size = sys.getsizeof(y) 
print(x_size) 
print(y_size) 
print(y_size == x_size) 

這應該打印出來

120 
120 
True 

所以我的結論是,它使用的內存爲常規條目。

相反,您可以使用稀疏矩陣(Scipy.sparse),它根本不保存零/空值,因此具有更高的內存效率。但是Scipy強烈不鼓勵直接使用Numpy方法https://docs.scipy.org/doc/scipy/reference/sparse.html,因爲Numpy可能無法正確解釋它們。

+0

在我的機器上,這會打印'108,120,False',因爲'x。dtype == np.int32'。爲了使其成爲一個有用的例子,你應該使用'1.0,2.0,3.0',這將使得數組具有相同的類型 – Eric

+0

好吧,對不起。我不知道這個例子中的機器可能有區別。但是爲了在我的機器上公平,它就是這樣工作的。此外'x.dtype == np.int64'和類似於'y == np.float64'的數據類型在我的情況下 –

1

當使用floating point表示的數字時,非數字值(NaNinf)也由佔用與任何數字浮點值相同位數的特定二進制模式表示。因此,NaN與陣列中的其他數字佔用相同的內存量。