您的程序可能无法尝试将整个数据集加载到RAM中。每个float32 32×1,000,000×1000 32位为3.7 GiB。在只有4 GiB
RAM的机器上,这可能是个问题。要检查实际上是否是问题,请尝试单独创建一个具有此大小的数组:
>>> import numpy as np>>> np.zeros((1000000, 1000), dtype=np.float32)
如果看到
MemoryError,则可能需要更多RAM,或者需要一次处理一个数据块。
对于h5py数据集,我们应该避免将整个数据集传递给我们的方法,而应传递数据集的切片。一次一个。
由于我没有您的数据,因此让我从创建相同大小的随机数据集开始:
import h5pyimport numpy as nph5 = h5py.File('rand-1Mx1K.h5', 'w')h5.create_dataset('data', shape=(1000000,1000), dtype=np.float32)for i in range(1000): h5['data'][i*1000:(i+1)*1000] = np.random.rand(1000, 1000)h5.close()它会创建一个漂亮的3.8 GiB文件。
现在,如果我们在Linux中,我们可以限制程序可以使用多少内存:
$ bash$ ulimit -m $((1024*1024*2))$ ulimit -m2097152
现在,如果我们尝试运行您的代码,我们将得到MemoryError。(按Ctrl-D退出新的bash会话并稍后重新设置限制)
让我们尝试解决问题。我们将创建一个IncrementalPCA对象,并将
.partial_fit()多次调用其方法,每次都提供数据集的不同部分。
import h5pyimport numpy as npfrom sklearn.decomposition import IncrementalPCAh5 = h5py.File('rand-1Mx1K.h5', 'r')data = h5['data'] # it's ok, the dataset is not fetched to memory yetn = data.shape[0] # how many rows we have in the datasetchunk_size = 1000 # how many rows we feed to IPCA at a time, the divisor of nipca = IncrementalPCA(n_components=10, batch_size=16)for i in range(0, n//chunk_size): ipca.partial_fit(data[i*chunk_size : (i+1)*chunk_size])它似乎对我有用,如果我查看
top报告,则内存分配保持在200M以下。



