我正在尝试为我的机器学习应用程序创建一个内存。内存的大小为NXz
,其中z
是向量的大小,N
是其在内存中的实例数。 N
可能很大。随着模型训练的进行,我将阅读和更新各个行。按照惯例,当使用h5py
创建数据集时,我们会这么做,
import h5py
import numpy as np
matrix = np.zeros((mem_size,zt_size))
with h5py.File("my_file.h5",'w') as hf:
hf.create_dataset("my_dset",matrix)
但是我担心如果我使用很大的mem_size
,matrix = np.zeros((mem_size,zt_size))
行可能会失败,因为RAM可能会被填满。另外,我认为我会迭代地填充内存,
vector = np.zeros((mem_size,zt_size))
with h5py.File("my_file.h5",'w') as hf:
for i in range(mem_size):
hf.create_dataset(str(i),vector)
但是,由于索引太多,现在我担心从内存中读取和更新会变慢。如何在不填满内存或不造成较大相对滞后的情况下进行此操作?还将欣赏使用不同库的替代实现。
注意,我将在培训期间使用光盘存储,因此这可能是我培训的瓶颈。
答案 0 :(得分:0)
我认为您使用术语“内存”表示系统RAM中的程序数据并保存在磁盘上。他们是不同的。
您是正确的,您的程序仅限于系统RAM可以“保存在内存中”的数据量。但是,程序可以从磁盘(文件中)访问比系统RAM大得多的数据。
例如,如果您有24GB的RAM,则程序可能会在内存中创建20GB的阵列(具体取决于系统当时在做什么)。然后,您可以将该阵列写入磁盘(创建20GB文件)。然后,您可以创建另一个20GB的内存数据,并将其追加到文件中(该数据将增加到40GB)。重复多次,每次文件都会变大。但是,程序的内存占用量不会增加(不会)。
使用大型数据集时,请设计程序以访问和使用数据子集。您可以使用HDF5将数据存储在磁盘上,而可以使用numpy / h5py将数据片读取到内存中。这本身就是一个完整的话题。